JokeClient Swift 仿寫學習

2021-07-15 11:31:49 字數 3743 閱讀 8956

在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 型別的例項

any 可以表示任意型別,甚至包括方法 (func) 型別

在 swift 中編譯器不僅不會對 anyobject 例項的方法呼叫做出檢查,甚至對於 anyobject 的所有方法呼叫都會返回 optional 的結果。

摘自: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...