2017-07-14 113 views
2

我在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')來開始的問題。 '班級學生{讓名字:字符串;讓studentID:Int ...}'。或者,至少,爲什麼你使用隱含的可選項。爲什麼不使用值類型?我同意w rmaddy的結論,你不應該使用這些特定的視頻,因爲看起來你只會選擇壞習慣。 – Rob

回答

5

第一個示例實質上是創建公開可讀但私密可寫的屬性。第二組代碼與第一組代碼不同。

寫這個代碼正確的方法是:

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在創建私有實例變量時進行的命名慣例。

個人而言,我會避免使用第一組代碼的視頻和教程。

+0

你爲什麼要避免使用第一組代碼的教程? – Frankie

+3

因爲這不是真正寫出像屬性一樣簡單的東西的最佳方式。如果作者不能做這麼簡單以及應該完成的事情,我不會相信他們編寫的其他代碼。但那是我。我想了解特定語言的最佳做法。第一組代碼看起來像是舊的Objective-C代碼的轉換,並沒有試圖在Swift中正確編寫它。 – rmaddy

+3

@Frankie - 使用折磨模式並使用下劃線和隱含的解包選項都表明作者不是一個強大的Swift程序員。你不想自己挑選這些習慣。誰知道他們以後在視頻中採用的其他不良做法...... – Rob