2017-02-12 52 views
0

我想這是一個容易的,但我一直在尋找幾個小時,仍然無法弄清楚我打電話做這個功能。函數調用超類的所有子類

所以說,我有一個超類country和三個子類這樣

class country { 
} 

class USA : country { 
} 
class China : country { 
} 
class France : country { 
} 
var countrys : [country] = [] 

,我現在想所有子類推向全國類的陣列

有什麼值得我追加函數調用? ?

countrys.append(contentsOf: ) 

任何提示的讚賞! :D

+3

超類不知道任何關於它的子類。您需要顯式創建每個子類的實例並將其添加到數組 – Paulw11

回答

2

在Objective-C中,使用自省,以及在C++中,使用在程序一開始就運行的靜態代碼,你想要做的事情是可能的。但是,這在Swift中是不可能的。

儘管您無法自動獲取某些內容,但手動方法仍可行。

定義你的類是這樣的:

class Country { 
    static var countries = [Country.Type]() 
    static func addMe() { Country.countries.append(self) } 
} 

class USA : Country { 
} 
class China : Country { 
} 
class France : Country { 
} 

,並在一些初始化代碼調用:

USA.addMe() 
France.addMe() 
China.addMe() 

然後調用print("Country.countries \(Country.countries)")會給你:

Country.countries [Module.USA, Module.France, Module.China] 

如果確實需要自動完成,看看你可以在Objective-C中做什麼,並有CountryNSObject的子類。

+0

嘿加里感謝您的回答!奇怪的事情,斯威夫特沒有這樣的功能來做到這一點。我將嘗試閱讀更多的Objective-C文檔! – Ian

1

否目標C是必需的,需要的或需要的。儘可能以最簡單的方式,您可以像這樣創建Country陣列,具體取決於它們是需要只讀還是讀寫。

class Country {} 

class USA: Country {} 
class China: Country {} 
class France: Country {} 

var countries = [Country]() 
countries.append(USA()) 
countries.append(China()) 
countries.append(France()) 

let moreCountries = [France(), China(), USA()] 

但是,爲每個可能的國家創建單獨的子類型是在面值時濫用類型系統。這是另一種更習慣的方式。但這是一個設計問題,取決於未提供的細節。

class Country { 
    let name: String 
} 

var countries = [Country]() 
countries.append(Country(name: "USA")) 
countries.append(Country(name: "China")) 
countries.append(Country(name: "France")) 

let moreCountries = [Country(name: "France"), Country(name: "China"), Country(name: "USA")) 

let usa = Country(name: "USA") 
let china = Country(name: "China") 
let france = Country(name: "France") 
let evenMoreCountries = [china, france, usa] 
+0

謝謝你解答我的拼寫錯誤的「國家」,所以如果我有很多的子類,我將不得不將它們追加到一個一個的排列? – Ian

+0

是的,你會的。所有集合必須是相同的類型。在你的例子中,各種子類型的數組使用共享/公用超類型來創建數組。警告:沒有人會像你一樣爲每個國家制造單獨的亞類。小心。 –