文章地址:
http://swift.gg/2016/03/09/swift-qa-2016-03-09/
問題一:
Extending Protocols With Default Implementation with Enums crashes Xcode
enum Ability {
case Flying
case Running
case Swimming
case Hiding
}
//All animals will conform to this
protocol Animal {
var name: String { get }
var specialAbility: Ability { get }
}
struct Dog: Animal {
var name: String
var specialAbility: Ability
}
let rex = Dog.init(name: "Rex", specialAbility: .Flying)
// 以下代碼會(huì)crash
extension Animal where Self: Dog {
var specialAbility: Ability { return .Running }
}
總結(jié):where語句的約束條件,不能是一個(gè)具體的類,只能是協(xié)議。
問題二:What does _: mean in Swift?
總結(jié):函數(shù)簽名里每個(gè)冒號(hào)都代表一個(gè)參數(shù),每個(gè)參數(shù)都要有個(gè)外部
參數(shù)名寫在冒號(hào)前面,寫_代表不要外部參數(shù)名。參數(shù)名都是自動(dòng)生
成的,默認(rèn)情況下第一個(gè)參數(shù)不生成外部參數(shù)名。
問題三:swift difference between final var and non-final var | final let and non-final let
總結(jié):final關(guān)鍵字主要用來修飾類和類中的屬性、方法或者下標(biāo)。子
類繼承時(shí),不能重寫父類中帶有final修飾的屬性、方法或下標(biāo)。如果
final修飾的是類,那么此類不能被繼承。
問題四:Swift array of generics
struct Thing<T> {
}
let intThing = Thing<Int>()
let stringThing = Thing<String>()
// 編譯錯(cuò)誤:Cannot convert value of type 'Thing<Int>' to expected type 'Thing'
let things: [Thing] = [intThing, stringThing]
總結(jié):Thing是一個(gè)范型結(jié)構(gòu)題,不能直接使用[Thing]表明一個(gè)數(shù)
組。只能通過Any來符合編譯器的規(guī)則。不過這樣的話,就不能直接
使用Thing里面的方法了,需要轉(zhuǎn)換。
問題五:Parentheses in Function and Closure
func myFunction() -> (()-> Int)
func myFunction1() -> (Void-> Int)
func myFunction2() -> Void-> Int
總結(jié):
* () 和 Void 是一樣的,2種不同的寫法而已??茨阆矚g,Swift 中比較常用 ()。
* -> 操作符是右關(guān)聯(lián)的,也就是說,多個(gè) -> 連接在一起時(shí)候,編譯器優(yōu)先解析右邊的。
所以以上3個(gè)定義是一樣的。第一個(gè)和第二個(gè)雖然加了括號(hào),優(yōu)先處
理最右邊的,但是因?yàn)?>是右關(guān)聯(lián)的,所以加括號(hào)和不加括號(hào)是一
樣的。
這3個(gè)表達(dá)式表示的意思是:定義一個(gè)函數(shù),沒有傳入?yún)?shù),返回一
個(gè)閉包, 閉包的類型是() -> Int