一冒黑、經(jīng)典題
1.Swift中的常量和OC中的常量有啥區(qū)別熄攘?
OC中用 const 是用來(lái)表示常量的,而 Swift 中用 let 是用來(lái)判斷是不是常量孕蝉。
OC中的常量(const)是編譯期決定的屡律,Swift中的常量(let)是運(yùn)行時(shí)確定的。
上面的區(qū)別更進(jìn)一步說(shuō)降淮,OC中 const 表明的常量類(lèi)型和數(shù)值是在 compilation time 時(shí)確定的超埋;而 Swift 中 let 只是表明常量(只能賦值一次),其類(lèi)型和值既可以是靜態(tài)的骤肛,也可以是一個(gè)動(dòng)態(tài)的計(jì)算方法纳本,它們?cè)?runtime 時(shí)確定的。
Swift中的常量可以是非特定類(lèi)型的腋颠,即它們的類(lèi)型可以在運(yùn)行時(shí)確定。例如吓笙,你可以定義一個(gè)常量淑玫,其值可以是任何類(lèi)型,只要在賦值時(shí)類(lèi)型明確即可。
在Objective-C中絮蒿,常量通常使用#define預(yù)處理器指令或const關(guān)鍵字定義尊搬。使用#define定義的常量在編譯時(shí)會(huì)被替換為它們的值,而使用const定義的常量在運(yùn)行時(shí)不可修改土涝。Objective-C中的常量類(lèi)型必須在編譯時(shí)確定佛寿,并且不能用作函數(shù)參數(shù)。
2.指定構(gòu)造器和便利構(gòu)造器有什么區(qū)別但壮?
類(lèi)必須要有一個(gè)指定構(gòu)造器冀泻,可以沒(méi)有便利構(gòu)造器
便利構(gòu)造器必須調(diào)用本類(lèi)另一個(gè)構(gòu)造器,最終調(diào)用到本類(lèi)的指定構(gòu)造器
便利構(gòu)造器前面需要添加convenience關(guān)鍵字
3.Any和AnyObject的區(qū)別蜡饵?
AnyObject只能表示引用類(lèi)型的任何實(shí)例弹渔,相當(dāng)于Objective-C中的id類(lèi)型。
Any可以表示類(lèi)溯祸,結(jié)構(gòu)體肢专,枚舉的任何實(shí)例。
AnyObject是Any的子集焦辅。
(延伸 oc中 id的本質(zhì)是struct objc_object結(jié)構(gòu)體指針博杖,可以指向任何OC對(duì)象,id指向基礎(chǔ)數(shù)據(jù)類(lèi)型會(huì)報(bào)編譯錯(cuò)誤筷登。)
4.In-Out(inout關(guān)鍵字)參數(shù)了解過(guò)嗎剃根?
默認(rèn)情況下,函數(shù)參數(shù)默認(rèn)是常量仆抵,試圖從函數(shù)體中去改變一個(gè)函數(shù)的參數(shù)值會(huì)報(bào)編譯錯(cuò)誤跟继。如果希望函數(shù)修改參數(shù)值,并在函數(shù)調(diào)用結(jié)束后仍然保留镣丑。這個(gè)時(shí)候就需要用到inout關(guān)鍵字舔糖。
注意事項(xiàng):
inout關(guān)鍵字只能修飾變量,無(wú)法修飾常量莺匠,因?yàn)槌A亢妥置媪坎荒鼙恍薷摹?br>
inout參數(shù)不能有默認(rèn)值金吗,可變參數(shù)不能標(biāo)記為inout。
調(diào)用函數(shù)的時(shí)候趣竣,應(yīng)該在變量名前放置&符號(hào)表示該變量可以由函數(shù)修改摇庙。
var variable: Int = 1
func changeNumber(num:inout Int) {
num = 2
print(num)
}
changeNumber(num: &variable) // 2
inout關(guān)鍵字修飾的變量傳遞過(guò)程:
- 如果實(shí)參有物理內(nèi)存地址,且沒(méi)有設(shè)置屬性觀察器
答: 直接將實(shí)參的內(nèi)存地址傳入函數(shù) (實(shí)參進(jìn)行引用傳遞)
2.如果實(shí)參是計(jì)算屬性 或者 設(shè)置了屬性觀察器
答:采取了Copy In Copy Out 的做法
- 調(diào)用該函數(shù)時(shí)遥缕,先復(fù)制實(shí)參的值卫袒,產(chǎn)生副本 [get]
2.將副本的內(nèi)存地址傳入函數(shù) (副本進(jìn)行引用傳遞),在函數(shù)內(nèi)部可以修改副本的值
3.函數(shù)返回后单匣,再將副本的值覆蓋實(shí)參的值 [set]
var man = person(heigth: 1, width: 1)
{
willSet(newValue){
print("即將 \(newValue) ")
}
didSet (oldValue){
print("已經(jīng) \(man) \(oldValue) ")
}
}
func addValue( _ value : inout person)->person
{
value.heigth = 20
value.width = 20
//如果將屬性觀察關(guān)掉夕凝,崩潰:因?yàn)檫`反了獨(dú)占原則:一個(gè)地址被別的地方引用后宝穗,不可以訪問(wèn)。Swift 需要對(duì)變量進(jìn)行獨(dú)占訪問(wèn)時(shí)才能修改該變量码秉。本質(zhì)上來(lái)說(shuō)逮矛,當(dāng)一個(gè)變量作為 inout 參數(shù)或者 mutating 方法中的 self 被修改時(shí),不能通過(guò)不同的名稱(chēng)被訪問(wèn)的转砖。
print("新",value,"舊",self.man)
return value
}
//執(zhí)行
let k = addValue(&man)
print(k)
//打印 因?yàn)橛袑傩杂^察器所以 copy须鼎。 執(zhí)行方法函數(shù)結(jié)束后再進(jìn)入屬性觀察器,再給返回值府蔗。
// 新 person(heigth: 20, width: 20) 舊 person(heigth: 1, width: 1)
// 即將 person(heigth: 20, width: 20)
// 已經(jīng) person(heigth: 20, width: 20) person(heigth: 1, width: 1)
// person(heigth: 20, width: 20)
總結(jié):
- inout參數(shù)的本質(zhì)是地址傳遞 (引用傳遞)晋控,不管什么情況都是傳入一個(gè)地址。
- Swift 值類(lèi)型中礁竞,屬性的默認(rèn)行為是不可變的糖荒。mutating關(guān)鍵字,用于在結(jié)構(gòu)體或枚舉的方法中修改屬性模捂。使用mutating修飾的方法(func)在修改屬性后更新原始值捶朵,而不是返回一個(gè)新的副本。
(mutating關(guān)鍵字只能用于值類(lèi)型狂男,mutating關(guān)鍵字本質(zhì)是包裝了inout關(guān)鍵字综看,加上mutating關(guān)鍵字后參數(shù)值會(huì)變成地址傳遞。
類(lèi)對(duì)象是指針岖食,傳遞的本身就是地址值红碑,所以 mutating關(guān)鍵字對(duì)類(lèi)是透明的,加不加效果都一樣泡垃。)
5.什么是自動(dòng)閉包析珊、逃逸閉包、非逃逸閉包蔑穴?
非逃逸閉包, 永遠(yuǎn)不會(huì)離開(kāi)一個(gè)函數(shù)的局部作用域的閉包就是非逃逸閉包忠寻。
func player(complete:(Bool)->()){
complete(true) //執(zhí)行閉包 傳入真
}
self.player { bool in
print( bool ? "yes":"no")
} // yes
當(dāng)一個(gè)閉包作為參數(shù)傳到一個(gè)函數(shù)中,但是這個(gè)閉包在函數(shù)返回之后才被執(zhí)行存和,我們稱(chēng)該閉包從函數(shù)中逃逸奕剃。在形式參數(shù)前寫(xiě)@escaping來(lái)明確閉包是允許逃逸的。
var completionHanglers: [() -> Void] = []
func someFunctionWithEscapingClosure(completionHangler: @escaping () -> Void) {
completionHanglers.append(completionHangler)
}
completionHanglers.first?()
自動(dòng)閉包:是一種自動(dòng)創(chuàng)建的閉包捐腿,用來(lái)把作為實(shí)際參數(shù)傳遞給函數(shù)的表達(dá)式打包的閉包.他不接受任何實(shí)際參數(shù),并且當(dāng)它被調(diào)用時(shí),它會(huì)返回內(nèi)部打包的表達(dá)式的值.
Autoclosure 是用于延遲執(zhí)行閉包的一種技術(shù)纵朋。使用 Autoclosure,我們可以將閉包作為參數(shù)傳遞給函數(shù)或方法茄袖,但是閉包不會(huì)立即執(zhí)行操软。相反,它會(huì)在需要時(shí)才會(huì)被執(zhí)行宪祥。
public func assert(_ condition:@autoclosure () -> Bool,_ message: @autoclosure () -> String = String(), file:StaticString = #file, line: Unit = #line)
let num = 3
assert(num>3,"num不能大于3")
var customersInLine = ["李一", "張2", "劉3", "趙四", "王五"]
override func viewDidLoad() {
super.viewDidLoad()
print(customersInLine.count)
// 打印出“5”
let customerProvider = { self.customersInLine.remove(at: 0) }//自動(dòng)閉包
print(customersInLine.count)//沒(méi)有執(zhí)行呢還 還是打印出“5”
print("移除了 \(customerProvider())!") //移除了 李一!
print(customersInLine)
serve(customer: customersInLine.remove(at: 0))
// 不用 @autoclosure 修飾
serve2(customer: { customersInLine.remove(at: 0) } )
}
func serve(customer customerProvider: @autoclosure () -> String) {
print("移除了 \(customerProvider())!")
print(customersInLine)
}
func serve2(customer customerProvider: () -> String) {
print("移除了 \(customerProvider())!")
print(customersInLine)
}
6.什么是Optional(可選項(xiàng)或者叫可選類(lèi)型)?
在變量類(lèi)型后加問(wèn)號(hào)(?)表示該變量可能有值也可能沒(méi)有值
底層Optional是一個(gè)包含None和Some(Wrapped)兩種類(lèi)型的泛枚舉類(lèi)型寺鸥,Optional.None即nil猪钮,Optional.Some非nil品山。
@frozen public enum Optional<Wrapped> : ExpressibleByNilLiteral {
/// The absence of a value.
///
/// In code, the absence of a value is typically written using the `nil`
/// literal rather than the explicit `.none` enumeration case.
case none
/// The presence of a value, stored as `Wrapped`.值的存在胆建,存儲(chǔ)為“Wrapped”
case some(Wrapped)
}
var optional1: String? = nil
var optional2: String? = .none
在OC中, nil是一個(gè)指向不存在對(duì)象的指針(OC非對(duì)象類(lèi)型也可以設(shè)置成nil但是會(huì)有警告??:指針不兼容)
在Swift中肘交,nil不是指針笆载,而是值缺失的一種特殊類(lèi)型,任何類(lèi)型的可選項(xiàng)都可以設(shè)置為nil而不僅僅是對(duì)象類(lèi)型涯呻,Swift 是一種類(lèi)型安全的語(yǔ)言凉驻,而 Objective-C 不是。這意味著在 Swift 中复罐,每個(gè)類(lèi)型的 nil 都是不同的涝登,例如 Int? 的 nil 和 String? 的 nil 是不同的,它們所代表的空值的類(lèi)型不同效诅。
非可選項(xiàng)類(lèi)型胀滚,不可設(shè)置為nil。Optional及可以包裝值類(lèi)型也可以包裝引用類(lèi)型乱投。
7.swift的派發(fā)機(jī)制(函數(shù)的派發(fā)機(jī)制:靜態(tài)派發(fā)(直接派發(fā))咽笼、函數(shù)表派發(fā)、消息派發(fā))戚炫?
1)swift中所有值類(lèi)型:struct剑刑、enum使用直接派發(fā)。
2)swift中協(xié)議的extensions(擴(kuò)展)使用直接派發(fā)双肤,初始聲明函數(shù)使用函數(shù)表派發(fā)
3)swift中class中extensions使用直接派發(fā)施掏,初始化聲明函數(shù)使用函數(shù)表派發(fā),dynamic修飾的函數(shù)使用消息派發(fā)茅糜。
4)swift中NSObject的子類(lèi)用@nonobjc或final修飾的函數(shù)使用直接派發(fā)七芭,初始聲明函數(shù)使用函數(shù)表派發(fā),dynamic修飾的extensions使用消息派發(fā)
swift(關(guān)鍵字)顯示指定派發(fā)方式限匣?
1)添加final關(guān)鍵字的函數(shù)使用直接派發(fā)
2)添加static關(guān)鍵字函數(shù)使用直接派發(fā)
3)添加dynamic關(guān)鍵字函數(shù)使用消息派發(fā)
4)添加@objc關(guān)鍵字的函數(shù)使用消息派發(fā)
5)添加@inline關(guān)鍵字的函數(shù)告訴編譯器可以使用直接派發(fā)
8.try抖苦、try?米死、try
“try”需要用“ do catch”捕捉異常锌历,如果在“try”代碼塊中出現(xiàn)異常,程序會(huì)跳轉(zhuǎn)到相應(yīng)的“catch”代碼塊中執(zhí)行異常處理邏輯峦筒,然后繼續(xù)執(zhí)行“catch”代碼塊后面的代碼究西。
enum NormalError: Error {
case one
case two
case three
case four
}
func someFunction(words: String) throws -> String {
switch words {
case "one":
throw NormalError.one
case "two":
throw NormalError.one
case "three":
throw NormalError.one
case "four":
throw NormalError.one
default:
return "ok"
}
}
//如果在“try”代碼塊中出現(xiàn)異常,程序會(huì)跳轉(zhuǎn)到“catch”代碼塊中執(zhí)行異常處理邏輯物喷。
do {
try someFunction(words: "five")
} catch {
print("An error occurred: \(error)")
}
“try?”是返回一個(gè)可選值類(lèi)型卤材,如果“try?”代碼塊中出現(xiàn)異常粘秆,返回值會(huì)是“nil”,否則返回可選值悴灵〉と可以在運(yùn)行時(shí)判斷是否有異常發(fā)生。
// 返回值是一個(gè)可選類(lèi)型,如果執(zhí)行正常的話(huà)就存在返回值帆精,否則如果拋出錯(cuò)誤的話(huà)返回值為nil
let result = try? say(words: "four")
// 可選綁定
if let res = try? doSomething(words: "four") {
}
else { print("出現(xiàn)錯(cuò)誤") }
// 提前退出
guard let resu = try? say(words: "four") else { return }
“try!”類(lèi)似于可選型中的強(qiáng)制解包较屿,它不會(huì)對(duì)錯(cuò)誤進(jìn)行處理,如果“try!”代碼塊中出現(xiàn)異常卓练,程序會(huì)在異常發(fā)生處崩潰隘蝎。
let result = try! someFunction()
print("The result is \(result)")
print(try? divide(2,1))//divide 整數(shù)除法運(yùn)算符(/)
// Optional(2.0)
print(try? divide(2,0))
// nil
print(try! divide(2,1))
// 2.0
print(try! divide(2,0))
// 崩潰
9.存儲(chǔ)屬性、計(jì)算屬性和類(lèi)型屬性的區(qū)別襟企?
存儲(chǔ)屬性用來(lái)進(jìn)行數(shù)據(jù)的存儲(chǔ), 需要分配內(nèi)存空間嘱么。子類(lèi)(無(wú)論是let var static修飾)不能直接重寫(xiě)存儲(chǔ)屬性。重寫(xiě)(Override)通常用于子類(lèi)覆蓋父類(lèi)的方法顽悼、計(jì)算屬性或觀察者曼振。
計(jì)算屬性:用來(lái)定義計(jì)算的過(guò)程, 不需要分配空間.計(jì)算屬性必須使用var關(guān)鍵字進(jìn)行定義。
類(lèi)型屬性:用于定義某個(gè)類(lèi)所有實(shí)例共享的數(shù)據(jù)表蝙。oc和swift都可以有類(lèi)型屬性拴测。
oc需要添加屬性關(guān)鍵字class定義類(lèi)型屬性(更像是通過(guò)調(diào)用屬性來(lái)調(diào)用一個(gè)方法,比較像計(jì)算屬性府蛇,oc中無(wú)法真正存儲(chǔ)值集索。)
swift類(lèi)型屬性:使用static、 class來(lái)定義汇跨。static(不支持重寫(xiě)) class(支持子類(lèi)重寫(xiě))务荆。
class HealthArticlesVC: BaseViewController {
// 存儲(chǔ)屬性
var age = 12
let name = "小花"
var ppName: String = { return "abc" }()
private let _searchTextField: UITextField = UITextField() //搜索
}
//計(jì)算屬性 應(yīng)用場(chǎng)景:一般用于獲取現(xiàn)有屬性加工和計(jì)算后的結(jié)果。
var petInfo:String{
get {
return "getbackName"
}
set (newInfo) {
print("\(newInfo)")
}
}
//類(lèi)型屬性
struct SomeStructure {
static var storedTypeProperty = "Some value."
static var computedTypeProperty: Int { return 1}
}
class SomeClass {
static var storedTypeProperty = "Some value."
static var computedTypeProperty: Int {
return 27
}
class var overrideableComputedTypeProperty: Int {
return 107
}
}
10.extension 中能增加存儲(chǔ)屬性嗎?
extension :可以增加計(jì)算屬性穷遂,不能增加存儲(chǔ)屬性函匕。
extension是用來(lái)給存在的類(lèi)型添加新行為的并不能改變類(lèi)型或者接口本身。因?yàn)?extension 不能為類(lèi)或結(jié)構(gòu)體增加實(shí)際的存儲(chǔ)空間蚪黑。
(swift 沒(méi)有分類(lèi)的概念 只有extension擴(kuò)展)
11.swift 中 closure閉包 與 OC 中 block 的區(qū)別盅惜?
相同點(diǎn):都是一段可以執(zhí)行的代碼塊
1、closure 是匿名函數(shù)忌穿,block 是一個(gè)結(jié)構(gòu)體對(duì)象抒寂。
2、closure 可以通過(guò)逃逸閉包來(lái)在內(nèi)部修改變量掠剑,block 通過(guò) __block 修飾符屈芜。
12.作用域關(guān)鍵字的區(qū)別
. private 只可以在本類(lèi)而且在同一個(gè)作用域中被訪問(wèn).
. fileprivate 可以在本類(lèi)中進(jìn)行訪問(wèn).
. internal (默認(rèn)值) 只能訪問(wèn)自己module(模塊)的任何internal實(shí)體,不能訪問(wèn)其他模塊中的internal實(shí)體.
. public 類(lèi)似于final,可以被其他module被訪問(wèn)井佑,不可以被重載和繼承.
. open 可以被其他module被訪問(wèn)属铁、被重載、被繼承.
二躬翁、冷門(mén)題
1.什么是柯里化焦蘑?
柯里化:把接受多個(gè)參數(shù)的函數(shù)變成接受一個(gè)單一參數(shù)(最初函數(shù)的第一個(gè))的函數(shù),并且返回接受余下的參數(shù)和返回結(jié)果的新函數(shù)姆另。
func multiplyTwoNumbers(_one:Int) -> (Int) -> Int {
return{$0* one}
}
//調(diào)用
let a = multiplyTwoNumbers(2)
let b = a(3)
print(b)//輸出6
2.swift 中map喇肋、flatMap、compactMap的區(qū)別
map: 正常遍歷
flatMap:已棄用:4.1迹辐,重命名為:“compactMap(_:)”,消息:“對(duì)于閉包返回可選值的情況甚侣,請(qǐng)使用compactMap明吩。
flatMap:可以自動(dòng)解包。特殊表達(dá)式可以去nil殷费。
//二維數(shù)組可以解包
let array = [[1,2,3], [4,5,6], [7,8,9]]
let arrayFlatMap = array.flatMap { $0 }
print(arrayFlatMap) //[1, 2, 3, 4, 5, 6, 7, 8, 9]
//這種則無(wú)法解包
var customArr2 : [Any] = ["李一", "張2", "劉3", "趙四", "王五",["吳6","范7","呂寶貝8"]]
let array2 = customArr2.flatMap { $0}
print(array2)//["李一", "張2", "劉3", "趙四", "王五", ["吳6", "范7", "呂寶貝8"]]
let fruits = ["apple", "banana", "orange", ""]
let counts = fruits.flatMap { fruit -> Int? in
let length = fruit.characters.count
guard length > 0 else {
return nil
}
return length
}
// [5,6,6]
compactMap :函數(shù)會(huì)自動(dòng)過(guò)濾掉映射結(jié)果為nil或者無(wú)效的值印荔,只保留非空的映射結(jié)果。
let possibleNumbers = ["1", "2", "three", "http:///4///", "5"]
//普通map遍歷
let mapped: [Int?] = possibleNumbers.map { str in Int(str) }
print(mapped)
//[Optional(1), Optional(2), nil, nil, Optional(5)]
let compactMapped: [Int] = possibleNumbers.compactMap { str in Int(str) }
print(compactMapped) //[1, 2, 5]
3.什么是函數(shù)式編程详羡?
面向?qū)ο缶幊蹋簩⒁鉀Q的問(wèn)題抽象成一個(gè)類(lèi)仍律,通過(guò)給類(lèi)定義屬性和方法,讓類(lèi)幫助我們解決需要處理的問(wèn)題(即命令式編程实柠,給對(duì)象下一個(gè)個(gè)命令)水泉。
函數(shù)式編程:數(shù)學(xué)意義上的函數(shù),即映射關(guān)系(如:y = f(x)窒盐,就是 y 和 x 的對(duì)應(yīng)關(guān)系草则,可以理解為"像函數(shù)一樣的編程")。它的主要思想是把運(yùn)算過(guò)程盡量寫(xiě)成一系列嵌套的函數(shù)調(diào)用蟹漓。
例:
數(shù)學(xué)表達(dá)式
(1 + 2) * 3 - 4
傳統(tǒng)編程
var a = 1 + 2
var b = a * 3
var c = b - 4
函數(shù)式編程
var result = subtract(multiply(add(1,2), 3), 4)
函數(shù)式編程的好處:
代碼簡(jiǎn)潔炕横,開(kāi)發(fā)迅速;
接近自然語(yǔ)言葡粒,易于理解份殿;
更方便的代碼管理;
易于"并發(fā)編程"嗽交;
代碼的熱升級(jí)卿嘲。
4.associatedtype 的作用
簡(jiǎn)單來(lái)說(shuō)就是 protocol 使用的泛型
例如定義一個(gè)列表協(xié)議
protocol ListProtcol {
associatedtype Element
func push(_ element:Element)
func pop(_ element:Element) -> Element?
}
實(shí)現(xiàn)協(xié)議的時(shí)候, 可以使用 typealias 指定為特定的類(lèi)型, 也可以自動(dòng)推斷, 如
class IntList: ListProtcol {
typealias Element = Int // 使用 typealias 指定為 Int
var list = [Element]()
func push(_ element: Element) {
self.list.append(element)
}
func pop(_ element: Element) -> Element? {
return self.list.popLast()
}
}
class DoubleList: ListProtcol {
var list = [Double]()
func push(_ element: Double) {// 自動(dòng)推斷
self.list.append(element)
}
func pop(_ element: Double) -> Double? {
return self.list.popLast()
}
}
使用泛型也可以
class AnyList<T>: ListProtcol {
var list = [T]()
func push(_ element: T) {
self.list.append(element)
}
func pop(_ element: T) -> T? {
return self.list.popLast()
}
}
//可以使用 where 字句限定 Element 類(lèi)型, 如:
extension ListProtcol where Element == Int {
func isInt() ->Bool {
return true
}
}
5.Self 的使用場(chǎng)景
Self 通常在協(xié)議中使用, 用來(lái)表示實(shí)現(xiàn)者或者實(shí)現(xiàn)者的子類(lèi)類(lèi)型.
例如, 定義一個(gè)復(fù)制的協(xié)議
protocol CopyProtocol {
func copy() -> Self
}
//如果是結(jié)構(gòu)體去實(shí)現(xiàn), 要將Self 換為具體的類(lèi)型
struct SomeStruct: CopyProtocol {
let value: Int
func copySelf() -> SomeStruct {
return SomeStruct(value: self.value)
}
}
如果是類(lèi)去實(shí)現(xiàn), 則有點(diǎn)復(fù)雜, 需要有一個(gè) required 初始化方法, 具體可以看這里
class SomeCopyableClass: CopyProtocol {
func copySelf() -> Self {
return type(of: self).init()
}
required init(){}
}
6.OC中的協(xié)議和swift中的協(xié)議 有什么區(qū)別?
Objective-C 的協(xié)議:聲明方法轮纫,不能實(shí)現(xiàn)腔寡。
Swift 中的協(xié)議:它可以定義計(jì)算屬性、方法掌唾、關(guān)聯(lián)類(lèi)型放前、靜態(tài)方法和靜態(tài)計(jì)算屬性等忿磅。
Swift 的協(xié)議還支持泛型、默認(rèn)實(shí)現(xiàn)凭语、條件約束葱她。
protocol MyProtocol {
// 計(jì)算屬性
var name: String { get set }
var age: Int { get }
// 方法
func greet() -> String
// 關(guān)聯(lián)類(lèi)型
associatedtype Item
func processItem(item: Item)
// 靜態(tài)方法
static func staticMethod() -> String
// 靜態(tài)屬性
static var staticProperty: String { get set }
}
extension MyProtocol {
// 默認(rèn)實(shí)現(xiàn)
func defaultImplementation() -> String {
return "Default implementation"
}
}
7.屬性默認(rèn)
OC中 屬性默認(rèn) 關(guān)鍵字 nonatomic,strong 似扔,readwrite
swift中 屬性默認(rèn) 關(guān)鍵字 nonatomic吨些,strong