在init關鍵字後面新增問號(init?)。可失敗構造器會建立乙個型別為自身型別的可選型別的物件。你通過return nil語句來表明可失敗構造器在何種情況下應該「失敗」。
struct animal
self.species = species
}}
1、從派生類轉換為基類,向上轉型(upcasts)class animal {}
class cat: animal {}
let cat = cat()
let animal = cat as animal
2.消除二義性,數值型別轉換let num1 = 42 as cgfloat
let num2 = 42 as int
let num3 = 42.5 as int
let num4 = (42 / 2) as double
3. switch 語句中進行模式匹配
如果不知道乙個物件是什麼型別,你可以通過switch語法檢測它的型別,並且嘗試在不同的情況下使用對應的型別進行相應的處理
switch animal
as? 和 as! 操作符的轉換規則完全一樣。但 as? 如果轉換不成功的時候便會返回乙個 nil 物件。成功的話返回可選型別值(optional),需要我們拆包使用。
由於 as? 在轉換失敗的時候也不會出現錯誤,所以對於如果能確保100%會成功的轉換則可使用 as!,否則使用 as?
let animal:animal = cat()
if let cat = animal as? cat else
**:swift - as、as!、as?三種型別轉換操作符使用詳解(附樣例)
函式引數可以同時有乙個區域性名稱(在函式體內部使用)和乙個外部名稱(在呼叫函式時使用),詳情參見函式的外部引數名。方法引數也一樣(因為方法就是函式,只是這個函式與某個型別相關聯了)。但是,方法和函式的區域性名稱和外部名稱的預設行為是不一樣的。
swift 中表示 「型別範圍作用域」 這一概念有兩個不同的關鍵字,它們分別是 static 和 class。
有乙個比較特殊的是 protocol。在 swift 中 class,struct 和 enum 都是可以實現某個 protocol 的。那麼如果我們想在 protocol 裡定義乙個型別域上的方法或者計算屬性的話,應該用哪個關鍵字呢?答案是使用 static 進行定義。在使用的時候,struct 或 enum 中仍然使用 static,而在 class 裡我們既可以使用 class 關鍵字,也可以用 static,它們的結果是相同的
現在只需要記住結論,在任何時候使用 static 應該都是沒有問題的。
摘自:static 和 class
any 和 anyobject 是 swift 中兩個妥協的產物,也是很讓人迷惑的概念。
anyobject 可以代表任何 class 型別的例項在 swift 中編譯器不僅不會對 anyobject 例項的方法呼叫做出檢查,甚至對於 anyobject 的所有方法呼叫都會返回 optional 的結果。any 可以表示任意型別,甚至包括方法 (func) 型別
摘自:any 和 anyobject
在 swift 中沒有 @selector 了,取而代之,從 swift 2.2 開始我們使用 #selector 來從暴露給 objective-c 的**中獲取乙個 selector。
func callme()
func callmewithparam(obj: anyobject!)
func turnbyangle(theangle: int, speed: float)
let somemethod = #selector(callme)
let anothermethod = #selector(callmewithparam(_:))
let method = #selector(turnbyangle(_:speed:))
最後需要注意的是,selector 其實是 objective-c runtime 的概念,如果你的 selector 對應的方法只在 swift 中可見的話 (也就是說它是乙個 swift 中的 private 方法),在呼叫這個 selector 時你會遇到乙個 unrecognized selector 錯誤:
//錯誤:
private func callme()
nstimer.scheduledtimerwithtimeinterval(1, target: self,
selector:#selector(callme), userinfo: nil, repeats: true)
//正確
@objc private func callme()
nstimer.scheduledtimerwithtimeinterval(1, target: self,
selector:#selector(callme), userinfo: nil, repeats: true)
最後,值得一提的是,如果方法名字在方法所在域內是唯一的話,我們可以簡單地只是用方法的名字來作為 #selector 的內容。相比於前面帶有冒號的完整的形式來說,這麼寫起來會方便一些:
let somemethod = #selector(callme)
let anothermethod = #selector(callmewithparam)
let method = #selector(turnbyangle)
但是,如果在同乙個作用域中存在同樣名字的兩個方法,即使它們的函式簽名不相同,swift 編譯器也不允許編譯通過:
func commonfunc()
func commonfunc(input: int) -> int
let method = #selector(commonfunc)
// 編譯錯誤,`commonfunc` 有歧義
對於這種問題,我們可以通過將方法進行強制轉換來使用:
let method1 = #selector(commonfunc as ()->())
let method2 = #selector(commonfunc as int->int)
**:selector
swift 2.0 帶來了guard
語句,這裡主要用來與if
來做比較
//好的寫法
func createperson() throws -> person
guard let ageformatted = int(age) else
return person(name: name, age: ageformatted)
}//差的寫法
func createpersonnoguard() -> person? else
} else
}
使用 guard 可以很容易地看到 person 例項的返回值,這樣就能明白這個方法的主要目的是什麼
**:為什麼 guard 比 if 好
簡易仿寫ArrayList
實現arraylist基於陣列的增刪改查 class testlist 無參 public testlist 求長度 public int size 獲取元素 public object get int x 新增元素 public void add e obj data size obj size ...
小白仿寫快排
快速排序是對氣泡排序的一種改進,使用的是分治法,主要思想為在待排序陣列中找到乙個關鍵資料 本例中為陣列第乙個數 設定兩個引數 i和 j 讓i從頭遍歷 j從尾遍歷,分別找比關鍵資料大的數和比關鍵資料小的數,找到之後讓i和j所指向的數交換,當i和j相等時,讓i和j指向的數和關鍵資料交換,使得關鍵資料左邊...
專案 仿寫bash程式
專案目標 在linux平台下仿寫一些命令的實現 1.輸出提示符資訊,類似於 stu host desktop 2.等待使用者輸入命令 3.完成簡單的解析 沒輸入命令情況 直接敲回車 輸入內建命令的情況 cd exit.輸入外接命令的情況 ls.的總體框架就是這樣的 要想實現上述功能我們要清楚linu...