2017-02-12 2 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, и имеете Country - подкласс NSObject.

+0

эй Гэри спасибо за ответ! что Swift не имеет такой функции. Я попытаюсь прочитать еще документацию Objective-C! – Ian

1

Нет Цель, требуемая, желательная или необходимая. В минимально возможном виде вы можете создать свои массивы 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

Да, вы это сделаете. Все коллекции должны быть одного типа. В вашем примере массив различных подтипов использует общий/распространенный тип суперкласса для создания массива. ПРЕДУПРЕЖДЕНИЕ: Никто не будет создавать отдельные подклассы для каждой страны, как вы. Быть осторожен. –

Смежные вопросы