带下划线的变量声明

Fra*_*kie 3 variables declaration swift

我在Youtube的一些视频中看过这个.

class Student {

    private var _name: String!
    private var _studentID: Int!

    var name: String {
        return _name
    }

    var studentID:Int {
        return _studentID
    }

    init(name: String, studentID: Int) {
        self._name = name
        self._studentID = studentID
    }
}
Run Code Online (Sandbox Code Playgroud)

他们为什么这样做(添加_name_studentID)而不是:

class Student {

    private var name: String!
    private var studentID: Int!

    init(name: String, studentID: Int) {
        self.name = name
        self.studentID = studentID
    }
}
Run Code Online (Sandbox Code Playgroud)

非常感谢你.

rma*_*ddy 6

第一个示例实质上是创建可公开读取但可私密写入的属性.

第二组代码与第一组代码的作用不同.

编写此代码的正确方法是:

private (set) var name: String // no need for the !
private (set) var studentID: Int // no need for the !

init(name: String, studentID: Int) {
    self.name = name
    self.studentID = studentID
}
Run Code Online (Sandbox Code Playgroud)

这使得外部用户可以读取属性,但只能由类设置.这是第一组代码实现的,但是更加冗长和不必要的方式.

下划线的使用只是在创建私有实例变量时从Objective-C继承的命名约定.

就个人而言,我会避免使用第一组代码的视频和教程.

  • 因为它不是写出像财产一样简单的东西的最佳方式.如果作者不能做到这么简单,应该做的事情,我不相信他们写的其他代码.但那就是我.我想学习给定语言的最佳实践.第一组代码看起来像旧的Objective-C代码的转换,而不试图在Swift中正确编写它. (3认同)
  • @Frankie - 使用折磨模式以及使用下划线和隐式解包的选项都表明作者不是一个强大的Swift程序员.你不想自己养成这些习惯.谁知道他们后来在视频中使用的其他不良做法...... (3认同)
  • @Frankie以[The Swift Programming Language](https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/)书开头.这就是我所使用的(以及来自可信用户的大量SO问题和答案). (2认同)