2017-02-12 1 views
0

これは簡単なことだと思いますが、私は何時間も探していますが、これを行うためにどのような関数を呼び出すのか分かりません。superClassからすべてのサブクラスを呼び出す関数

ので、私はこの

class country { 
} 

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

のような1つのスーパークラスcountryと3つのサブクラスを持っていると私は今

私は関数appendで何を呼び出すか国クラスの配列にすべてのサブクラスをプッシュすると言いますか? ?

countrys.append(contentsOf: ) 

ヒントありがとうございます! :D

+3

スーパークラスはそのサブクラスについて何も知らない。各サブクラスのインスタンスを明示的に作成し、それを配列に追加する必要があります。 – Paulw11

答えて

2

Objective-Cでは、イントロスペクションを使用して、C++では、プログラムの最初で実行される静的コードを使用して、実行したいことを実行できます。しかし、スイフトでは不可能です。

自動的に起こることはありませんが、手作業によるアプローチが有効です。

あなたのクラスのようなものを定義します

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

私のスペルミスの「国」に答えると訂正してくれてありがとう、私はサブクラスがたくさんある場合、それらを1つずつ配列に追加する必要がありますか? – Ian

+0

はい、そうです。すべてのコレクションは同じタイプでなければなりません。あなたの例では、さまざまなサブタイプの配列は共有/共通のスーパークラス型を使用して配列を作成します。警告:誰もあなたのように各国の個別のサブクラスを作成することはありません。注意してください。 –

関連する問題