2017-08-07 72 views
0
class person { 
    var name : String 

    init(name: String) { 
     self.name = name 
    } 
} 

我学习斯威夫特类章self.name =在Swift中的名称。我不明白为什么这个代码需要

为什么需要init(name:String) self.name = name代码 这段代码的目的是什么,我不明白。

我宣称var name: String 并再次init(name: String),为什么需要self.name = name

只是var nameself.name = name有什么不同?

+0

'变种名称:String'声明你的财产。初始化程序'init'在您创建类的实例时被调用。传入'person(名称:“jihoon”)''的字符串将被分配给该属性。在声明'self.name = name'中,'self.name'指向属性,'name'是我的例子中传入的字符串 - “jihoon”。 – vacawama

回答

0

Classesstructures必须在创建该类或结构的实例时将其存储的所有属性设置为适当的初始值。存储的属性不能处于不确定状态。

class person { 
    var name : String // undetrmined state 
    init(name: String) { 
     self.name = name 
    } 
} 
class person2 { 
    var name : String = "default value" // detrmined state 
    // Now these intializer are not optional. You can use these initializer or not. 
    init(name: String) { 
     self.name = name 
    } 
    init() { 
    } 
} 
// Aother example for optional stored property 
class person3 { 
    var name : String? // detrmined state, because default value for optional is nil 
    // Now these intializer are not optional. You can use these initializer or not. 
    init(name: String) { 
     self.name = name 
    } 
    init() { 
    } 
} 

欲了解更多信息阅读这一个Apple Doc

+0

嗨jihoon,你检查我的答案吗? – iMuzahid

+0

谢谢你的帮助!是的,我已经检查:) – jihoon

+0

感谢您的关注。 upvote请:) – iMuzahid

3

调查一下所谓的变量范围。在您的代码中 - 您的init中有两个“名称变量 - 类(或实例)变量和”参数。

后者 - init(name:)仅是内您的初始化函数使用,这意味着实例具有没有名没有self.name = name一旦你创建的实例。

只要您的实例类person是前者可用 - 对于实例。

为了进一步解释,试试这个。改变你的代码:

class Person { 
    var myName : String 
    var myOtherName : String 

    init(name: String) { 
     self.myName = name 
    } 
} 

在您的应用程序或视图控制器,这样做:

let myPerson = Person(name: "john") 
print(myPerson.myName)  // prints "jihoon" 
print(myPerson.myOtherName) // prints nothing 
print(myPerson.name)   // generates a build error because name doesn't exist 

最后一个音符 - 斯威夫特类名都是大写的,所以最好的名字是Person,不person

+0

谢谢你的帮助! – jihoon

相关问题