2016-06-21 180 views
2

即使沒有指定init方法,以下代碼塊仍可正常運行。如果是這種情況,init方法的用途是什麼?爲什麼我們需要指定init方法?

struct Person { 
    var name: String 
    var age: Int 

    init(name: String, age: Int){ 
     self.name = name 
     self.age = age 
    } 

} 

let somePerson = Person(name: "Sam", age: 21) 
somePerson.name 
somePerson.age 

謝謝您的反饋。

回答

1

這是struct在swift中的行爲。

見(按成員初始化器的結構類型)的https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Initialization.html

「結構類型自動接收如果 他們不定義任何自己定製的初始化的按成員初始化。不像 默認初始值,該結構接收成員初始化程序 ,即使它存儲了沒有默認值的屬性。「

如果您沒有指定任何成員初始化方法,它將爲您創建。你聲明的init允許你做的不僅僅是一個簡單的init。例如:

struct Person { 
    var name: String 
    var age: Int 

    init(name: String, age: Int){ 
     self.name = name.uppercaseString() 
     self.age = age + 22 
     //and more works ... 
    } 

} 
1

如在本文檔

Swift initializers

夫特提供的任何結構或類 對於其所有屬性提供缺省值,並且不缺省初始化指出至少提供一個初始化程序本身 。默認初始值設定項簡單地 將創建一個新實例,並將其所有屬性設置爲其默認值 的值。

結構類型自動接收成員初始值設定項,如果他們不 定義他們自己的任何自定義初始值設定項。與默認的 初始值設定項不同,即使它存儲了沒有默認值的屬性,結構也會收到成員初始值設定項。

所以如果你寫了一個init方法,那麼你必須自己編寫默認的初始化方法,如果你希望它存在的話。

如果您只需要默認的初始化程序,那麼您可以忽略它。

+0

... *提供默認值*實際上並非如此。 – vadian

+0

是的,我擴大到包括相關部分... –

0

你不需要它(了)。成員初始化是Swift 2.2的一個新特性。作者要麼爲早期版本的Swift編寫代碼,要麼不知道它不再必要。

相關問題