Swift與OC之間的關(guān)系:
- Swift 與 OC共同運行在同一編譯環(huán)境下,雖然 Swift 現(xiàn)在已經(jīng)更新到4.0的版本,但是任然需要依賴有些OC現(xiàn)成的類庫調(diào)用。在Swift3之后,一些語法改變了很多禽篱,不過還是有跡可循的。OC出現(xiàn)過的絕大多數(shù)概念馍惹,比如引用計數(shù)躺率、ARC、屬性万矾、協(xié)議悼吱、接口、初始化良狈、擴展類后添、命名參數(shù)、匿名函數(shù)等薪丁,Swift大多數(shù)概念與OC一樣遇西。當(dāng)然Swift也多出了一些新興概念馅精,這些在OC中是沒有的,比如范型粱檀、元組等洲敢。
Swift和OC的區(qū)別
1.不像C語言和OC語言一樣都必須有一個主函數(shù)main()作為程序的入口, swift程序從第一句開始向下順序執(zhí)行, 一直到最后
2.每個語句結(jié)束后可以不加分號, 但是多條語句不能寫在同一行
3.在聲明常亮后者變量的時候直接初始化可以省略其類型, 否則需要在變量名稱跟冒號加類型. 實際開發(fā)中建議全部都加上, 以免出現(xiàn)問題
4.swift數(shù)據(jù)類型都會自動判斷, 只區(qū)分變量var 和 常量let
5.swift可以多對多賦值. let(x,y) = (1,2)
swift和OC比較具有全局性, 因為swift是全局的所以編譯的速度比OC慢
6.還有一些因為入門沒多久, 所以就不一一闡述了
- 7.swift中繼承協(xié)議和繼承結(jié)構(gòu)體的區(qū)別:
import UIKit
// swift之構(gòu)造體
// 學(xué)習(xí)點: 1.繼承結(jié)構(gòu)體與繼承協(xié)議的區(qū)別
protocol A {
init(a: Int)
}
struct B: A {
init(a: Int) { // 如果繼承構(gòu)造體協(xié)議, 學(xué)習(xí)點: 協(xié)議與代理的區(qū)別
// 代理需要直接繼承協(xié)議并遵守協(xié)議方可實現(xiàn)方法
// 構(gòu)造體協(xié)議只需要繼承相應(yīng)的協(xié)議就可以實現(xiàn)協(xié)議方法
}
}
class C : A {
required init(a: Int) {
// 如果是系統(tǒng)的類繼承構(gòu)造體協(xié)議茄蚯, 會報錯
// 如果是繼承構(gòu)造體協(xié)議压彭, 遵守方法并在構(gòu)造體函數(shù)之前加required關(guān)鍵詞
}
}
class ViewController: UIViewController {
//, A {
// required init(a: Int) {
// super.init() // 類構(gòu)造器不同于協(xié)議構(gòu)造器: 一般實現(xiàn)的類構(gòu)造器有兩種: 1.指定構(gòu)造器(指定構(gòu)造器在類中必須至少有一個), 2.便利構(gòu)造器(沒有限制)
// // 協(xié)議構(gòu)造器不能直接使用到
// }
// required init?(coder aDecoder: NSCoder) {
// fatalError("init(coder:) has not been implemented")
// }
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
&&& 構(gòu)造體協(xié)議遇到的坑:
錯誤1
Must call a designated initializer of the superclass 'UIViewController'
因為重載了指定構(gòu)造器, 所以來自父類的指定構(gòu)造器并不會被繼承.
而 init(coder aDecoder: NSCoder) 方法是來自父類的指定構(gòu)造器, 因為這個構(gòu)造器是 required, 必須要實現(xiàn). 但是因為我們已經(jīng)重載了 init(), 定義了一個指定構(gòu)造器, 所以這個方法不會被繼承, 要手動覆寫, 這就是第一個錯誤的原因.
我們已經(jīng)手動覆寫了這個方法, 然后, 因為 init() 方法雖然被重載了, 但是并沒有調(diào)用父類的指定構(gòu)造器:
指定構(gòu)造器必須調(diào)用它最近父類的指定構(gòu)造器.
所以我們讓這個指定構(gòu)造器調(diào)用 super.init(), 解決了這個問題.
只需要刪掉這個 init(coder aDecoder: NSCoder) 方法就可以解決這個錯誤了.
- swift 協(xié)議在類中使用:
import UIKit
// 實例方法協(xié)議
protocol RandomGeneratable {
func randomNumber() -> Int
}
struct RandomNumber: RandomGeneratable {
func randomNumber() -> Int {
return Int(arc4random()) // 產(chǎn)生一個隨機數(shù)
}
}
class TerRandomNumber: RandomGeneratable {
func randomNumber() -> Int {
return Int(arc4random())
}
}
struct Dice {
var sides: Int
var randomNumber: RandomGeneratable
func play() -> Int {
return self.randomNumber.randomNumber() % sides + 1
}
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
// let aDice = Dice(sides: 4, randomNumber: TerRandomNumber())
// let aDice = Dice(sides: 4, randomNumber: RandomNumber)
// 區(qū)別: 因為不管是結(jié)構(gòu)體還是類, 都繼承了 RandomGeneratable 協(xié)議第队,所以在randomNumber: 參數(shù)中傳入的時候哮塞, 傳入結(jié)構(gòu)體和類都是可以的
// 個人補充: 這里還有就是補充了一下結(jié)構(gòu)體和類調(diào)用屬性時的區(qū)別
// 類調(diào)用屬性: 需要實例化后的類方法去調(diào)用
// 結(jié)構(gòu)體調(diào)用屬性: 直接使用結(jié)構(gòu)體調(diào)用
// 感覺類和結(jié)構(gòu)體實例化的時候都是一樣的刨秆,都是實例化的時候調(diào)用屬性(個人理解)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}