p;(one: String, two: String) -> Bool in
return one < two
}
答案:
第一个简化的是参数。系统的参数类型推断功能,可以计算出闭包里面参数的类型,所以你不必定义参数的类型:
let sortedAnimals = animals.sort { (one, two) -> Bool in return one < two }
函数返回值也可以被推断出来,所以简化掉,代码变为:
let sortedAnimals = animals.sort { (one, two) in return one < two }
这个$i 符号可以代替参数名字,代码进一步简化为:
let sortedAnimals = animals.sort { return $0 < $1 }
在一个独立的闭包内,return这个关键字是可以省略的。最后声明的返回值就是闭包的返回值:
let sortedAnimals = animals.sort { $0 < $1 }
这简化很多了,但是我们不能止步于此!
对于字符串,有一个定义如下的比较函数:
func Bool
这个简单的小函数可以使你的代码简洁如下:
let sortedAnimals = animals.sort(<)
注意每一步的编译结果都相同,但是最后一步你的闭包里只有一个字符。
问题5 – Swift 1.0 or later
下面的代码创建了两个类Address和Person,并且创建了两个实例对象分别代表Ray和Brain.
class Address {
var fullAddress: String
var city: String
init(fullAddress: String, city: String) {
self.fullAddress = fullAddress
self.city = city
}
}
class Person {
var name: String
var address: Address
init(name: String, address: Address) {
self.name = name
self.address = address
}
}
var headquarters = Address(fullAddress: "123 Tutorial Street", city: "Appletown")
var ray = Person(name: "Ray", address: headquarters)
var brian = Person(name: "Brian", address: headquarters)
假设Brain搬家到街对面的建筑物里,那么你会这样更新他的地址:
brian.address.fullAddress = "148 Tutorial Street"
这样做将会发生什么?错误出在什么地方呢?
答案:Ray同样会搬家到新的建筑物里面。Address是一个引用类型类,所以无论你是通过ray或者brain访问headquarters,访问都是同一个实例化对象。headquarters对象的变化也会引起ray和brain的变化。你能想象如果Brain收到Ray的邮件或者相反Ray收到Brain的邮件,将会发生什么?解决方案是创建一个新的Address对象赋值给Brain或者把Address声明成为结构体而不是一个类。
中级
问题1– Swift 2.0 or later
思考下面的代码:
var optional1: String? = nil
var optional2: String? = .None
nil 和 .None有什么不同?optional1和optional2有什么不同?
答案:两者没有什么不同。Optional.None(简称.None)是optional变量值初始化的标准方法,而nil只是.None语法的一种修饰。事实上下面语句输出是正确的:
nil == .None // On Swift 1.x this doesn't compile. You need Optional
.None
记住枚举类型的Optional下的None:
enum Optional{
case None
case Some(T)
}
问题2-Swift 1.0 or later
下面是thermometer作为类和结构体的例子:
public class ThermometerClass {
private(set) var temperature: Double&nb