swift經(jīng)典面試題

一冒黑、經(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ò)程:

  1. 如果實(shí)參有物理內(nèi)存地址,且沒(méi)有設(shè)置屬性觀察器
    答: 直接將實(shí)參的內(nèi)存地址傳入函數(shù) (實(shí)參進(jìn)行引用傳遞)

2.如果實(shí)參是計(jì)算屬性 或者 設(shè)置了屬性觀察器
答:采取了Copy In Copy Out 的做法

  1. 調(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é):

  1. inout參數(shù)的本質(zhì)是地址傳遞 (引用傳遞)晋控,不管什么情況都是傳入一個(gè)地址。
  2. 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)属铁、被重載、被繼承.


private.png

public_open.png

二躬翁、冷門(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市炒辉,隨后出現(xiàn)的幾起案子豪墅,更是在濱河造成了極大的恐慌,老刑警劉巖黔寇,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件偶器,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡缝裤,警方通過(guò)查閱死者的電腦和手機(jī)屏轰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)憋飞,“玉大人霎苗,你說(shuō)我怎么就攤上這事¢蛔觯” “怎么了唁盏?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)瘤睹。 經(jīng)常有香客問(wèn)我升敲,道長(zhǎng),這世上最難降的妖魔是什么轰传? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任驴党,我火速辦了婚禮,結(jié)果婚禮上获茬,老公的妹妹穿的比我還像新娘港庄。我一直安慰自己,他們只是感情好恕曲,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布鹏氧。 她就那樣靜靜地躺著,像睡著了一般佩谣。 火紅的嫁衣襯著肌膚如雪把还。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,590評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音吊履,去河邊找鬼安皱。 笑死,一個(gè)胖子當(dāng)著我的面吹牛艇炎,可吹牛的內(nèi)容都是我干的酌伊。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼缀踪,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼居砖!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起驴娃,我...
    開(kāi)封第一講書(shū)人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤奏候,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后托慨,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體鼻由,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年厚棵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蔼紧。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡婆硬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出奸例,到底是詐尸還是另有隱情彬犯,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布查吊,位于F島的核電站谐区,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏逻卖。R本人自食惡果不足惜宋列,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望评也。 院中可真熱鬧炼杖,春花似錦、人聲如沸盗迟。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)罚缕。三九已至艇纺,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背黔衡。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工蚓聘, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人员帮。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓或粮,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親捞高。 傳聞我的和親對(duì)象是個(gè)殘疾皇子氯材,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 總結(jié)關(guān)于swift的面試題------持續(xù)更新 來(lái)源于網(wǎng)上、書(shū)籍等 侵權(quán)即刪-聯(lián)系我[741136856@qq.c...
    橘子的皮閱讀 1,612評(píng)論 0 12
  • Swift語(yǔ)言至今誕生有一年多的時(shí)間了硝岗,已經(jīng)成為當(dāng)前最流行語(yǔ)言之一氢哮。雖然它的語(yǔ)法簡(jiǎn)單好用,但實(shí)際上Swift是一門(mén)...
    TedX閱讀 10,003評(píng)論 1 39
  • 問(wèn)題一: 下面代碼中變量 tutorial1.difficulty 和 tutorial2.difficulty ...
    CrystalZhu閱讀 265評(píng)論 0 2
  • 初級(jí) 1型檀、swift和OC的區(qū)別冗尤? 1)swift是靜態(tài)語(yǔ)言,有類(lèi)型推斷胀溺,OC是動(dòng)態(tài)語(yǔ)言裂七。 2)swift是一門(mén)支...
    kakaLP閱讀 18,482評(píng)論 1 33
  • http://www.reibang.com/p/bdaa49f9d1a4[https://www.jiansh...
    Abner_XuanYuan閱讀 16,128評(píng)論 2 41