在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
我们可用swift的闭包来定义变量的值。 先来一个简单的例子大家先感受感受。 定义一个字符串的变量的方法: 直接赋值: var string = "A string" 还可以用闭包的方式定义: var string1: String = { return "A string" }() 闭包还可以这么定义,省略了等号和括号: var string2: String { return "A string" } 闭包中可以定义get方法 var string3: String { get { return "A string" } } 也可以定义set方法,但定义set方法必须有get方法 var string4: String { get { return "A string" } set { print("set OK") } } 也可以使用 willSet 和didSet方法, 注意 willSet /didSet不能和get/set共同使用的, 在使用willSet /didSet时,变量需要有初始值 var string5: String = "A string" { willSet { print("newValue: \(newValue)") //"newValue: new Value\n" } didSet { print("oldValue: \(oldValue)") //"oldValue: A string\n" } } string5 = "new Value" 通过上面这个例子, 我们感觉闭包的表达实现形式很多。 下面系统总结一下。 闭包最全的定义形式是: { (arguments)->returnType in code }(arguments) 可以在闭包中定义参数,返回值。 闭包后用括号执行,并在括号中可以传参。 例如: var componseString = { (arg1: String, arg2: String) -> String in return arg1 + arg2 }("A", "B") print(componseString) //"AB\n" 基于上面最全的定义方式, 我么可以省略参数的类型: var componseString1 = { arg1, arg2 -> String in return arg1 + arg2 }("A", "B") print(componseString1) //"AB\n" 为什么能省略参数类型? 那是因为, swift的类型推导,根据后面括号的传参能自动判断参数的类型。 然后我们可以省略闭包中的返回值类型 var componseString2: String = { arg1, arg2 in return arg1 + arg2 }("A", "B") print(componseString2) //"AB\n" 注意,闭包省略了返回值类型后,变量要显示声明它的类型, 之所以能省略返回值类型,那也是因为swift类型推导,先知道了变量的类型,所以可以省略返回值类型。 还可以把参数省略掉 var componseString3: String = { return $0 + $1 }("A", "B") print(componseString3) //"AB\n" 如果闭包中只有一行代码, 其实return 也能省略。 var componseString4: String = { $0 + $1 }("A", "B") print(componseString4) //"AB\n" 如果闭包没有定义参数 ,像这样 var componseString5: String = { return "A String" }() print(componseString5) //"A String" 可以把括号省略了,省略括号的同时,也不能写等号 var componseString6: String { return "A String" } print(componseString6) //"A String" 上面这种闭包表现方法似曾相识, 如果你学过swift的类,知道类的属性可以用闭包表示, 可以在闭包中定义 set, get , willSet,didSet等方法。 那么上面变量是否也能这样定义呢? var string4: String { get { return "A string" } set { print("set OK") } } var string5: String = "A string" { willSet { print("newValue: \(newValue)") //"newValue: new Value\n" } didSet { print("oldValue: \(oldValue)") //"oldValue: A string\n" } } string5 = "new Value" 其实类的属性就是变量。 类的属性能定义的 set, get , willSet,didSet 在变量中也能定义。 本文摘自:http://my.oschina.net/lanrenbar/blog/467768 |
请发表评论