lConvertible
BooleanLiteralConvertible
IntegerLiteralConvertible
FloatLiteralConvertible
UnicodeScalarLiteralConvertible
ExtendedGraphemeClusterLiteralConvertible
StringLiteralConvertible
ArrayLiteralConvertible
DictionaryLiteralConvertible
采用相应的协议并且提供一个允许字面量初始化的公用方法。在Thermometer类型的例子下,我们需要实现FloatLiteralConvertible协议,代码如下:
extension Thermometer : FloatLiteralConvertible {
public init(floatLiteral value: FloatLiteralType) {
self.init(temperature: value)
}
}
那么现在,你就可以通过一个简单的float数字创建一Thermometer对象,代码如下:
var thermometer: Thermometer = 56.8
问题2 - Swift 1.0 or later
Swift 拥有一系列预定义的运算符,这些运算符执行不同类型的操作,例如算术运算符和逻辑运算符。它甚至允许创建自定义的运算符,无论是一元运算符还是二元运算符。自定义一个满足一下规格的幂运算符:
以两个整数作为参数
返回第一个参数的第二个参数次方的值
忽略潜在溢出错误
答案:创建一个自定义的运算符需要两个步骤:声明它和实现它。
使用operator关键字来声明指定的类型(一元或者二元)、组成这个运算符字符的顺序已经它的优先级和关联性。
在这中情况下,运算符是^^,类型是infix(二进制),关联性是right,优先级设置成为155,原因是乘法和除法的优先级是150.下面就是具体的声明代码:
infix operator ^^ { associativity right precedence 155 }
代码实现如下:
func ^^(lhs: Int, rhs: Int) -> Int {
let l = Double(lhs)
let r = Double(rhs)
let p = pow(l, r)
return Int(p)
}
值得注意的是,它并不需要溢出考虑;如果操作产生的结果int不能代表,如大于int.max,就会发生运行时错误。
问题3 - Swift 1.0 or later
你能像下面的代码一样使用原始值定义一个枚举类型吗?如果不行,说明原因。
enum Edges : (Double, Double) {
case TopLeft = (0.0, 0.0)
case TopRight = (1.0, 0.0)
case BottomLeft = (0.0, 1.0)
case BottomRight = (1.0, 1.0)
}
答案:不行。原始值得类型必须满足一下条件
遵守Equatable协议
满足能转换成下列类型中的任何一个类型:
a.Int
b.String
c. Character
在上面的代码中,原始值即使是独立的个体值,但是它仍然是一个不兼容的元组。
问题4- Swift 2.0 or later
下面的代码定义了一个结构体Pizza和一个协议Pizzeria,这个协议有一个包含makeMargherita()函数的扩展。
struct Pizza {
let ingredients: [String]
}
protocol Pizzeria {
func makePizza(ingredients: [String]) -> Pizza
func makeMargherita() -> Pizza
}
extension Pizzeria {
func makeMargherita() -> Pizza {
return makePizza(["tomato", "mozzarella"])
}
}
现在你将要定义一个如下的Lombardi的餐馆:
struct Lombardis: Pizzeria {
func makePizza(ingredients: [String]) -> Pizza {
return Pizza(ingredients: ingredients)
}
func makeMargherita() -> Pizza {
return makePizza(["tomato", "basil", "mozzarella"])
&