我有一個類Population,它在初始化時被定義為language. 為了這個例子,該人群中的每個成員都只會說這種特定的語言。然后,我在人口成員中Member定義了一個類。Population在這個類中,我想將語言存盤為靜態型別屬性,以便能夠從Member下面示例代碼中的方法參考。
這對我來說似乎比(a)當我在元素上呼叫方法時總是必須傳遞language作為引數members或(b)在每個Member實體上存盤語言時更有效。但是,下面的代碼似乎不太有效,我想知道如何最好地實作它。有什么想法/最佳實踐嗎?抱歉,如果這聽起來很微不足道,或者如果我在這里完全走錯了路。
class Population {
var language: String
var members: [Member]
init(language: String) {
self.language = language
for _ in 1...10 {members.append(Member())}
}
class Member {
static let language: String
func speak() {
switch self.language {
case "english": print("speak some english")
}
}
func write() {
switch self.language {
case "english": print("write some english")
}
}
}
}
uj5u.com熱心網友回復:
我認為關于什么意思存在一些混淆static,它可能源于class Member嵌套在class Population. 所有嵌套型別都將嵌套型別包含在命名空間中,這有助于 a) 避免全域范圍內型別的名稱沖突,并且 b) 使您能夠將其隱藏為嵌套型別的實作細節(如果您選擇)使其成為一種private型別。
嵌套型別不屬于封閉型別的實體。因此,如果您定義language為 的一個static屬性,那么無論您有多少不同語言的實體,Member它都有一個值。class MemberPopulation
你想要的是每個實體Member都擁有它所屬language的。Population您可以通過幾種不同的方式來實作這一點,但它們都涉及將某些內容存盤在Member.
選項 1.language創建 的實體屬性Member,并將其設定為Member.init(language: String)。
選項 2. 存盤對所屬的 的參考Population(Member我假設它是let population: Population),并創建language一個回傳的計算屬性population.language。
選項 2 更靈活,因為您可以利用填充來獲取Member它從它獲取的其他值Population,但它需要仔細考慮。Member在您的應用程式中 a存在于 a 之外是否有意義Population?如果是,那么您可能希望將其定義為weak var population: Population?. 如果否,則 aMember不能存在于 a 之外Population,那么unowned let population: Population可能是首選(盡管weak也可以使用該版本)。這里的重點是避免會導致記憶體泄漏的參考回圈。
所以也許是這樣的:
class Population {
var language: String
var members: [Member] = []
init(language: String) {
self.language = language
for _ in 1...10 {members.append(Member(population: self))}
}
class Member {
unowned let population: Population
var language: String { population.language }
init(population: Population) { self.population = population }
func speak() {
switch self.language {
case "english": print("speak some English")
case "german" : print("spreche ein Bi?chen deutsch")
// other cases go here
default: print("mmmm mmmm mmm mmm") // I'm a mute
}
}
func write() {
switch self.language {
case "english": print("write some English")
case "german" : print("schreibe ein Bi?chen deutsch")
// other cases go here
default: print("h8hta;lushgaih9732 8@#Y"); // Can't write
}
}
}
}
雖然題外話,但我建議將 language 設定為enum,然后您可以default從switch陳述句中洗掉大小寫,編譯器會幫助您(雖然不委婉)向您顯示switch添加新語言時需要更新的所有陳述句。如果您愿意,您甚至可以制作enum基于,String這樣您仍然可以在String任何可能有用的地方訪問該值:
enum Language: String
{
case arabic = "arabic"
case chinese = "chinese"
case english = "english"
case french = "french"
case german = "german"
case japanese = "japanese"
case portuguese = "portuguese"
case spanish = "spanish"
// etc...
}
然后,如果您想要字串值,您可以參考language.rawValue
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/516572.html
標籤:迅速班级特性静止的
