【问题标题】:self.name = name in Swift . I don't understand why this codes are neededself.name = Swift 中的名称。我不明白为什么需要这些代码
【发布时间】:2017-08-07 00:40:32
【问题描述】:
class person {
    var name : String 

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

我正在学习 Swift 类章节

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

我声明了var name: String 又是init(name: String),为什么需要self.name = name

var nameself.name = name 之间有什么不同?

【问题讨论】:

  • var name: String 声明您的财产。创建类的实例时会调用初始化程序init。传递给person(name: "jihoon") 的字符串将分配给该属性。在语句self.name = name 中,self.name 指的是属性,name 是传入的字符串 - 在我的示例中为“jihoon”。

标签: swift init


【解决方案1】:

研究一种叫做变量范围的东西。在您的代码中 - 有两个“名称变量” - 一个类(或实例)变量和一个“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

最后一点 - 在 Swift 中,类名是大写的,所以最好的名字是 Person,而不是 person

【讨论】:

    【解决方案2】:

    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

    【讨论】:

    • 嗨 jihoon,你检查我的答案了吗?
    • 感谢您的帮助!是的,我已经检查过:)
    猜你喜欢
    • 1970-01-01
    • 2023-04-01
    • 2016-12-07
    • 1970-01-01
    • 2018-09-12
    • 2019-08-26
    • 2012-05-25
    • 2012-11-17
    • 2020-03-02
    相关资源
    最近更新 更多