我很難理解兩者之間的區別,或者便利init的目的。 謝謝便捷的init vs init在swift中的區別是什麼,明確的例子更好
回答
標準init
:
指定的初始值是一類主要的初始化。指定的初始值設定項完全初始化 所引入的所有屬性,並調用適當的超類初始化程序繼續執行 初始化過程到超類鏈。
convenience init
:
便利初始化是次要的,輔助的初始化爲一個 類。您可以定義一個便利初始值設定項,以便從與初始值設定項相同的類中調用指定的 初始值設定項,並將指定的初始值設定項參數的某些 設置爲默認值。您可以使用 也定義便利初始值設定程序,爲特定用例或輸入值類型創建該類 的實例。
基本上所有這意味着簡而言之就是你用一個方便的初始化,使調用指定初始化更快,更「方便」。因此,便捷初始值設定項需要使用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長初始化自定義視圖和這樣的,當我使用這些不少。文件比我更好地解釋,檢查出來!
當你有一些具有很多屬性的類時會使用方便初始值設定項,這使得它總是使用所有變量初始化智慧類,所以你使用方便初始值設定項是做什麼的,的變量來初始化對象,併爲其餘的賦值一個默認值。 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
這是一個簡單的例子,取自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.
注:閱讀全文
指定的初始值是一類主要初始化。指定的初始化程序完全初始化由該類引入的所有屬性,並調用適當的超類初始化程序以繼續初始化過程直至超類鏈。
便捷初始值設定項是次要的,支持一個類的初始值設定項。您可以定義一個便利初始值設定項,以便從與初始值設定項相同的類中調用指定初始值設定項,並將某些指定初始值設定項的參數設置爲默認值。
的類指定的初始值被寫入到相同的方式簡單初始化爲值類型:
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
- 1. init()和init(_:bool)有什麼區別
- 2. Cocoa-Touch。類方法init版本alloc/init之間的語義區別是什麼?
- 3. submodule add和init有什麼區別?
- 4. ng-init與ng-bind有什麼區別?
- 5. init和initWithID的區別
- 6. 在swift中使用了什麼「init」?
- 7. 什麼是JSCC.get ... init?
- 8. 字節碼之間的區別。 <init>()V vs。 <init>(Z)V
- 9. apache.felix.dm包中的init()和start()方法有什麼區別?
- 10. iOS的 - 爲什麼是init必要和其他的init問題
- 11. 在MVC範例中,是控制器中的View init還是View中的Controller init?
- 12. [self init]和self之間的區別= [super init]
- 13. JSValue的init(BOOL:在:) VS JSValueMakeBoolean()
- 14. 之間的區別:init-state vs:構建函數的狀態
- 15. 這兩個Lua例子有什麼區別?更好嗎?
- 16. [[NSMutableArray alloc] init]和[@ [] mutableCopy]之間有什麼區別?
- 17. 什麼是最準確的;聲明VS準備好的聲明
- 18. swift init在objecitve-C
- 19. 在Swift 3中,「public init(){}」是什麼意思?
- 20. 重寫方便的init
- 21. [[alloc] init]和[[thing] retain]之間有什麼區別?
- 22. Init方法:這兩者有什麼區別?
- 23. SWIFT uiviewcontroller init
- 24. window.onload = init();有什麼不同?和window.onload = init;
- 25. __construct()和init()之間的區別
- 26. UIViewController init vs initWithNibName:bundle:
- 27. Windows的Cloud-Init等效物是什麼?
- 28. 什麼是servlet的init()方法用於?
- 29. 這個jQuery init的含義是什麼?
- 30. - (id)init方法有什麼好處?
您是否閱讀過[初始化](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
SO中已有答案。請參閱 - http://stackoverflow.com/questions/30896231/why-convenience-keyword-is-even-needed-in-swift – Santosh