Swift基础小结_2
import Foundation
// MARK: - ?和!的区别
// ?代表可选类型,实质上是枚举类型,里面有None和Some两种类型,其实nil相当于OPtional.None,如果非nil相当于OPtional.Some
// !强制解包
//var number : Int? // 此时解包会崩溃
var number : Int? = 8 // 此时解包不会崩溃
// 如果对没值(nil)的变量进行强制解包的情况下会造成崩溃
var number1 = number!
print(number1)
// 可选绑定,不用强制解包
if var number2 = number {
print(number2)
}
// !隐式解析可选类型:有值,没值(nil)
// 如果!强行解析没值的变量,也会造成崩溃
//var intNumber : Int! // 此时解包会崩溃
var intNumber : Int! = 6 // 此时解包不会崩溃
var intNumber1 = intNumber
print(intNumber1)
// 可选绑定
if var intNumber2 = intNumber {
print(intNumber2)
}
// MARK: - 结构体
// 1.声明一个结构体
struct Rect {
// 声明结构体变量的属性(存储属性)
var x : Float
var y : Float
var width : Float
var height : Float
// 声明结构体属性, 要使用static
static var description : String?
// 声明一个计算属性(是用来专门计算结构体变量属性的setter和getter方法的,本身并没有存储功能)
var centerX : Float {
// set方法
set {
x = newValue
}
// get方法(必须要写)
get {
return x / 2
}
}
var centerY : Float {
// 可以不写set方法,只写get方法
get {
return y / 2
}
}
// 声明方法
// 声明一个结构体变量方法(相当于OC中的实例方法)
func frameInfor() {
print("x : \(x), y : \(y), width : \(width), height : \(height)")
}
// 声明一个结构体方法(相当于OC中的类方法),使用static修饰
static func inFor() {
print("这是结构体方法")
}
}
// 2.根据结构体去定义一个结构体变量
var frame = Rect(x: 10, y: 10, width: 100, height: 100)
// 3.访问结构体变量中的属性
// 注意:结构体变量的属性类型可以使用let去修饰,只不过访问的时候不能进行修改
frame.x = 20
print(frame.x)
// 4.访问结构体属性
Rect.description = "我是结构体属性"
print(Rect.description)
// 5.访问计算属性
frame.centerX = 200 // 这句话相当于在调用centerX的set方法
let value = frame.centerX // 这句话就相当于在调用centerX的get方法
print(value)
// 6.调用结构体变量方法
frame.frameInfor()
// 7.调用结构体方法
Rect.inFor()
// MARK: - 类(class)
class Person {
var name : String?
var age : Int?
// 构造初始化方法
init (name : String, age : Int) {
self.name = name
self.age = age
}
// 自定义初始化方式(可以只初始化一部分属性)
init (name : String) {
self.name = name
}
// 声明类属性
static var introduce : String?
// 计算属性
var value : Int {
set(a) {
age = a // 在写计算属性的时候,一定不能出现self.,否则会造成死循环
}
get {
return age!
}
}
// 声明一个类方法
// 1.在类方法前边加上static修饰【虽然是一个类方法,但是该方法在子类中不能进行重写】
static func sayHi() {
print(introduce) // 注意:在类方法中只能使用类属性,不能使用对象属性
}
// 2.在类方法前边加上class修饰【它是一个类方法,可以被子类重写】
class func sayHi1() {
print(introduce)
}
// 声明一个实例(对象)方法
func sayHi2() {
print("hello, 我是实例方法")
}
}
// 1.创建对象(此时应该和OC区分开来,实例对象,:后边跟的是类,要初始化对象一定要写初始化构造的方法)
var person1 : Person = Person(name : "卫庄", age : 20)
// 2.访问类中的属性(对象属性)
print(person1.name!)
// 3.访问类属性
Person.introduce = "我是盖聂"
print(Person.introduce)
// 4.访问计算属性
person1.value = 28
print(person1.value)
// 5.访问类方法
Person.sayHi()
Person.sayHi1()
// 6.访问实例方法
person1.sayHi2()
// MARK: - 定义一个子类Student,继承Person
// 在swift中不支持多继承
class Student : Person {
// 重写父类的方法
// 重写父类中的类方法(class修饰的可以重写,static修饰的不可以重写)
override class func sayHi1() {
print("我是子类Student类,重写了父类的类方法")
}
// 重写父类中的实例方法
override func sayHi2() {
print("我是子类Student类,重写了父类的对象方法")
}
}
// 初始化student对象
var student : Student = Student(name: "天明", age: 12)
// 调用类方法
Student.sayHi1()
// 调用使用方法
student.sayHi2()
// MARK: - 值类型和引用值类型的区别
/*
// 值类型
struct animal {
var name : String?
var age : Int?
init(name : String, age : Int) {
self.name = name
self.age = age
}
}
var dog = animal(name: "贝贝", age: 3)
var dog1 = dog // 此时将dog的数据拷贝给dog1
dog.name = "欢欢"
print("dog.name : \(dog.name!), dog1.name : \(dog1.name!)")
*/
// 引用值类型
class animal {
var name : String?
var age : Int?
init(name : String, age : Int) {
self.name = name
self.age = age
}
}
var dog = animal(name: "贝贝", age: 3)
var dog1 = dog
dog.name = "欢欢"
print("dog.name : \(dog.name!), dog1.name : \(dog1.name!)")
// MARK: - 协议(protocol)
// 当swift中声明协议的时候,协议里有可选方法需要使用@objc关键字修饰
@objc protocol MarrayDelegate {
func cook() // 做饭
func wash() // 洗衣服
optional func hitDoudou() // 打豆豆
}
protocol DivorceDelegate {
func diviseMoney() // 分割财产
}
// 如果一个类要遵循协议的时候,如果这个类有父类要在:后先写父类,然后用,隔开,后面跟着协议
class Man: Person, MarrayDelegate, DivorceDelegate {
@objc func cook() {
print("我要做饭了")
}
@objc func wash() {
print("我要洗衣服了")
}
func diviseMoney() {
print("分财产")
}
}
// 创建一个男人
let man = Man(name: "韦小宝", age: 22)
man.cook()
man.wash()
man.diviseMoney()
// MARK: - 扩展(Extension)
// 1.扩展协议中的相关方法
extension Man {
@objc func hitDoudou() {
print("嘿嘿嘿")
}
}
man.hitDoudou()
// 2.扩展还可以扩展类方法(类似于OC中的Category)以及对象方法
extension Man {
// 扩展一个对象方法
func sing() {
print("唱一首歌")
}
// 扩展一个类方法
class func sleep() {
print("多喝水")
}
}
man.sing()
Man.sleep()
// MARK: - 闭包
// 求两个数的最大值
/*
在OC中使用Block实现
int (^myBlock)(int num1, int num2) = ^int (int num1, int num2) {
return num1 > num2 ? num1 : num2
}
*/
// 使用闭包
var myBlock : ((num1 : Int, num2 : Int) ->Int)
// 第一种使用方式
myBlock = {
(num1 : Int, num2 : Int) ->Int in // 切记不能忘记in
return num1 > num2 ? num1 : num2
}
// 第二种方式
myBlock = {
num1, num2 in
return num1 > num2 ? num1 : num2
}
// 第三种方式
myBlock = {
num1, num2 in
num1 > num2 ? num1 : num2
}
// 第四种方式
myBlock = {
$0 > $1 ? $0 : $1
}
// 第五种方式
myBlock = {
(num1, num2) ->Int in
return num1 > num2 ? num1 : num2
}
var max = myBlock(num1: 66, num2: 88)
print(max)
Swift基础小结_2的更多相关文章
- swift 基础小结01 --delegate、Optional、GCD的使用、request请求、网络加载图片并保存到沙箱、闭包以及桥接
本文主要记录swift中delegate的使用.“?!”Optional的概念.GCD的使用.request请求.网络加载图片并保存到沙箱.闭包以及桥接. 一.delegate的使用 swift中de ...
- swift 基础小结02 -- VFL约束、属性的get和set方法、懒加载、方法替换
一.属性的get和set方法 1.自定义属性的set和get方法 private(set) var _image:UIImage? //自定义属性get,s ...
- swift基础:第六部分:类与对象
http://reactnative.cn/docs/0.24/getting-started.html#content(react Native 开发文档) 互联网这个时代,你松懈一天,就会有很多很 ...
- swift基础:第二部分:函数和闭包
今天本来想利用上午的时间本来打算将swift基础部分学习完的,不巧的是,后台来和我讨论用户评价的接口,讨论过后,商讨出一种可行的方案,十几分钟时间过去了,我拿到将接口介入到已经完成的页面中,完美,终于 ...
- Swift基础语法学习总结(转)
Swift基础语法学习总结 1.基础 1.1) swift还是使用// 和/* */ 来注释,并且/* */允许多行注释. 1.2) swift使用print和println打印,它的传参是一个泛型 ...
- Swift基础语法学习总结
Swift基础语法学习总结Swift高级语法学习总结Swift语法总结补充(一) 1.基础 1.1) swift还是使用// 和/* */ 来注释,并且/* */允许多行注释. 1.2) swift ...
- swift -- 基础
swift -- 基础 1.常量和变量 常量: let 变量: var 2.声明常量和变量 常量的声明: let let a = 1 //末尾可以不加分号,等号两边的空格必须对应(同 ...
- iOS Swift 模块练习/swift基础学习
SWIFT项目练习 SWIFT项目练习2 iOS Swift基础知识代码 推荐:Swift学习使用知识代码软件 0.swift中的宏定义(使用方法代替宏) 一.视图 +控件 1.UIImag ...
- Swift基础学习
Swift基础学习 http://c.biancheng.net/cpp/html/2242.html 这个网站最近看了一下,对于基本语法解释概括的相对全面,如同重新练习一遍OC似的,挺全面的,谢谢 ...
随机推荐
- Visual Studio 2010 C++ 工程文件解读
在 VS2010 中,C++ 的工程文件已经和 2005 / 2008 有了很大的不同,而是完全采用 MSBUILD 的属性方式进行表达,并且可以让用户通过一次性的配置而对所有的属性进行自定义: 根据 ...
- Android开发如何去除标题栏title
虽然是一个小问题,今天遇到了,也就写下来吧.防止自己忘掉. 取消标题栏的方式有两种,一种是在代码添加,另一种是在AndroidManifest.xml里面添加. 1.在代码中实现:在此方法setCon ...
- cordova local notification plugin
cordova plugin add org.apache.cordova.device cordova plugin add https://github.com/katzer/cordova-pl ...
- dell ipmi sol
http://blog.arnoudvermeer.nl/post/52375062605/howto-setup-ipmi-sol-on-a-dell-r-series-server http:// ...
- 优化Linux下的内核TCP参数来提高服务器负载能力
http://blog.renhao.org/2010/07/setup-linux-kernel-tcp-settings/ /proc/sys/net目录 所有的TCP/IP参数都位于/proc/ ...
- hosts文件导致打不开某些网站
如果出现,某些网站访问不了,公司也没有进行限制的情况下,考虑是hosts文件出问题了. 解决办法:删除hosts文件,新建一个同名文件.
- vim插件之SnipMate
SnipMate简介 snipMate一款功能强大的代码补齐插件,可自定义代码模板,并具备单词补齐的功能. vim插件snipMate下载地址 SnipMate安装 将snipMate.zip解压到~ ...
- JavaScript API 设计原则
网+线下沙龙 | 移动APP模式创新:给你一个做APP的理由>> 好的 API 设计:在自描述的同时,达到抽象的目标. 设计良好的 API ,开发者可以快速上手,没必要经常抱着手册和文档, ...
- 快速清理Visual Studio起始页最近打开项目
清除vs2008起始页最近打开项目 第一种:最简单的方式: 把以下内容保存为.bat批处理文件 @echo off@REG Delete HKCU\Software\Microsoft\VisualS ...
- thinkphp foreach循环生成二维数组的方法
先做个问题记录,另外下面是做的过程中遇到的一个没想明白的现象 foreach($result as $key => $val ){ $wzList[$key]['lik']=$val[0]; $ ...