使用下划线声明变量

3
我在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
    }
}

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

class Student {

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

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

非常感谢你。

1
rmaddy的回答是正确的。但是这些模式只应在您确实需要它公开为只读但私下可变时使用。但是您似乎根本没有对其进行突变,这就引出了为什么不一开始就使用常量(使用let)的问题,例如class Student { let name: String; let studentID: Int ... }。或者,至少为什么要使用隐式可选项。为什么不使用值类型?我同意rmaddy的结论,您不应该使用那些特定的视频,因为看起来您只会养成坏习惯。 - Rob
1个回答

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
}

这使得属性对外部用户可读,但仅由类设置。 这就是第一组代码实现的内容,但是以一种更冗长和不必要的方式。

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

个人建议避免使用第一组代码的视频和教程。


3
因为把简单的属性写得这么复杂并不是最好的方法。如果作者不能像应该做的那样处理这么简单的事情,我就不会相信他们编写的其他代码。但这只是我的想法。我想学习某种语言的最佳实践。第一组代码看起来像是将旧的Objective-C代码转换而来,没有尝试用Swift正确编写它。 - rmaddy
3
@Frankie - 使用复杂的代码结构、下划线和隐式解包可选值等都表明作者并不是一位优秀的Swift程序员。你不应该模仿这些习惯。而且,也许在后面的视频中他们还使用了其他糟糕的做法... - Rob
1
@Frankie 我几乎可以保证(也许你可以调查一下),视频的作者有一个Java程序,在那里他们不断编写getter/setter(在Swift中是不必要的,因为属性会自动合成它们),并且习惯于所有东西都是可空的。 - Alexander
2
@Frankie 从Swift编程语言书开始学习。这是我所使用的全部内容(以及来自可信用户的许多SO问题和答案)。 - rmaddy
1
@Frankie - 请查看苹果公司的Swift资源页面,他们在其中推荐了一些书籍和视频。 - Rob
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接