2016-10-17 54 views
12

我很難理解兩者之間的區別,或者便利init的目的。 謝謝便捷的init vs init在swift中的區別是什麼,明確的例子更好

+0

您是否閱讀過[初始化](https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Initialization.html#//apple_ref/doc/uid/TP40014097-CH18- [Swift編程語言](https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics)中的[ID203]部分。html#// apple_ref/doc/uid/TP40014097-CH5-ID309)書?你的困惑究竟是什麼? – rmaddy

+1

SO中已有答案。請參閱 - http://stackoverflow.com/questions/30896231/why-convenience-keyword-is-even-needed-in-swift – Santosh

回答

17

標準init

指定的初始值是一類主要的初始化。指定的初始值設定項完全初始化 所引入的所有屬性,並調用適當的超類初始化程序繼續執行 初始化過程到超類鏈。

convenience init

便利初始化是次要的,輔助的初始化爲一個 類。您可以定義一個便利初始值設定項,以便從與初始值設定項相同的類中調用指定的 初始值設定項,並將指定的初始值設定項參數的某些 設置爲默認值。您可以使用 也定義便利初始值設定程序,爲特定用例或輸入值類型創建該類 的實例。

爲每Swift Documentation

基本上所有這意味着簡而言之就是你用一個方便的初始化,使調用指定初始化更快,更「方便」。因此,便捷初始值設定項需要使用self.init而不是像super.init那樣的內容,您可以在覆蓋指定的初始化程序時看到它。

僞例如:

init(param1, param2, param3, ... , paramN) { 
    // code 
} 

// can call this initializer and only enter one parameter, 
// set the rest as defaults 
convenience init(myParamN) { 
    self.init(defaultParam1, defaultParam2, defaultParam3, ... , myParamN) 
} 

創造與擁有主要deafults長初始化自定義視圖和這樣的,當我使用這些不少。文件比我更好地解釋,檢查出來!

11

當你有一些具有很多屬性的類時會使用方便初始值設定項,這使得它總是使用所有變量初始化智慧類,所以你使用方便初始值設定項是做什麼的,的變量來初始化對象,併爲其餘的賦值一個默認值。 Ray Wenderlich網站上有一個非常好的視頻,不確定它是否免費,因爲我有付費帳戶。 這裏是一個例子,你可以看到,而不是初始化我的對象與所有這些變量我只是給它一個標題。

struct Scene { 
    var minutes = 0 
} 

class Movie { 
    var title: String 
    var author: String 
    var date: Int 
    var scenes: [Scene] 

    init(title: String, author: String, date: Int) { 
    self.title = title 
    self.author = author 
    self.date = date 
    scenes = [Scene]() 
    } 

    convenience init(title:String) { 
    self.init(title:title, author: "Unknown", date:2016) 
    } 

    func addPage(page: Scene) { 
    scenes.append(page) 
    } 
} 


var myMovie = Movie(title: "my title") // Using convenicence initializer 
var otherMovie = Movie(title: "My Title", author: "My Author", date: 12) // Using a long normal initializer 
3

這是一個簡單的例子,取自Apple Developer portal

基本上指定的初始化程序是init(name: String),它確保所有存儲的屬性都被初始化。

init()便利初始值設定項,不帶參數,通過使用指定的初始值設定項,自動將存儲屬性的值設置爲[Unnamed]

class Food { 
    let name: String 

    // MARK: - designated initializer 
    init(name: String) { 
     self.name = name 
    } 

    // MARK: - convenience initializer 
    convenience init() { 
     self.init(name: "[Unnamed]") 
    } 
} 

    // MARK: - Examples 
    let food = Food(name: "Cheese") 
    let food = Food() 

這是有用的,當你處理大類,至少有一些存儲的屬性。我會建議讀一些更多的可選項,並繼承在Apple Developer portal.

0

注:閱讀全文

指定的初始值是一類主要初始化。指定的初始化程序完全初始化由該類引入的所有屬性,並調用適當的超類初始化程序以繼續初始化過程直至​​超類鏈。

便捷初始值設定項是次要的,支持一個類的初始值設定項。您可以定義一個便利初始值設定項,以便從與初始值設定項相同的類中調用指定初始值設定項,並將某些指定初始值設定項的參數設置爲默認值。

的類指定的初始值被寫入到相同的方式簡單初始化爲值類型:

init(parameters) { 
statements 
} 

便利初始化都寫在相同的風格,但與便利改性劑放置在init關鍵字之前,通過分離一個空間:

convenience init(parameters) { 
statements 
} 

一個實際的例子如下:

class Food { 
var name: String 
init(name: String) { 
    self.name = name 
} 
convenience init() { 
    self.init(name: "[Unnamed]") 
} 
} 
let namedMeat = Food(name: "Bacon") 
// namedMeat's name is "Bacon」 

Food類的init(name:String)初始值設定項是作爲指定的初始值設定項提供的,因爲它確保新的Food實例的所有存儲屬性都已完全初始化。 Food類沒有超類,所以init(name:String)初始化器不需要調用super.init()來完成它的初始化。

「Food類還提供了一個方便的初始值設定項init(),它沒有參數。在init()初始化通過跨到食品類的init委託一個新的食品提供了默認的佔位符名稱:用一個名字值(名稱字符串)[無名]:」

「let mysteryMeat = Food() 
// mysteryMeat's name is "[Unnamed]」 

層次結構中的第二級是食物的一個子類RecipeIngredient。 RecipeIngredient類在烹飪食譜中模擬一種成分。它引入了(除了從食物繼承的name屬性),並定義了兩個初始化創建RecipeIngredient情況下,所謂的數量有一個int屬性:

class RecipeIngredient: Food { 
var quantity: Int 
init(name: String, quantity: Int) { 
    self.quantity = quantity 
    super.init(name: name) 
} 
override convenience init(name: String) { 
    self.init(name: name, quantity: 1) 
} 
} 

的RecipeIngredient類有一個指定初始化時,init(名稱:字符串,數量:Int),可用於填充新的RecipeIngredient實例的所有屬性。此初始化器通過將傳遞的數量參數分配給數量屬性開始,這是RecipeIngredient引入的唯一新屬性。這樣做後,初始化程序將委派給Food類的init(name:String)初始值設定項。摘自:蘋果公司「Swift編程語言(Swift 4)」,iBooks。 https://itunes.apple.com/pk/book/the-swift-programming-language-swift-4-0-3/id881256329?mt=11

相關問題