我有一個類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 Member
Population
你想要的是每個實體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
標籤:迅速班级特性静止的