bsp;return reduced.1
}
}
注意:只有元类型实现了Comparable协议新的方法才可以被使用。例如,如果你在全部是UIView对象的数组中调用countUniques,编译器将会报错。
import UIKit
let a = [UIView(), UIView()]
a.countUniques() // compiler error here because UIView doesn't implement Comparable
问题5- Swift 2.0 or later
下面一个函数的功能是计算两个double(optional)类型的数的相除的结果。在执行除法之前,必须提前满足三个条件:
被除数必须包含nil值
除数必须为包含nil值
除数不能为零
func divide(dividend: Double?, by divisor: Double?) -> Double? {
if dividend == .None {
return .None
}
if divisor == .None {
return .None
}
if divisor == 0 {
return .None
}
return dividend! / divisor!
}
上面的函数可以正常使用,但是会存在两个问题:
那些前提条件可以利用guard语句。
使用了强制拆包。
请使用guard语句和避免使用强制拆包来优化这个函数。
答案:guard语句是在Swift 2.0中引进的,它是用途是在未满足某个条件时,提供一个退出的路径。对于检查是否满足先决条件来说,它是非常有用的。因为它可以使你更清晰的表达逻辑——而不是像i各种f语句嵌套实现那么复杂。下面就是一个例子:
guard dividend != .None else { return .None }
它也可以在optional binding(可选绑定)中使用。使用guard语句之后,使拆包后的变量可以被访问。
guard let dividend = dividend else { return .None }
所以divide函数被重写如下:
func divide(dividend: Double?, by divisor: Double?) -> Double? {
guard let dividend = dividend else { return .None }
guard let divisor = divisor else { return .None }
guard divisor != 0 else { return .None }
return dividend / divisor
}
我们发现隐身的可拆包的运算在代码的最后一行,因为dividend和divisor这两个参数已经被拆包并且以分别以一个常量来存储。
因此,你可以再次使用guard语句,使上面的函数更简洁:
func divide(dividend: Double?, by divisor: Double?) -> Double? {
guard let dividend = dividend, divisor = divisor where divisor != 0 else { return .None }
return dividend / divisor
}
上面的函数中使用了两个guard语句,因为使用了where语句指定了divisor不能为0的条件。
高级
问题1- Swift 1.0 or later
下面是thermometer作为结构体的例子:
public struct Thermometer {
public var temperature: Double
public init(temperature: Double) {
self.temperature = temperature
}
}
创建一个thermometer实例对象,你可以使用下面的代码:
var t: Thermometer = Thermometer(temperature:56.8)
但是像下面的代码那样初始化对象是否会更好:
var thermometer: Thermometer = 56.8
能这样做吗?如果可以,怎么做?提示:it has to do with convertibles, but not convertibles like Camaros and Mustangs
答案:Swift 定义了下面的协议,这些协议可以使一种类型通过字面量的方式来初始化并赋值。
NilLitera