2016-07-27 2 views
0

Поэтому у меня есть два класса Base и More, который выглядит как этогометод, который возвращает объект типа, который был вызван из

class Base:NSObject { 
    class func whatsMineType() -> Base { 
     return Base() 
    } 
} 

class More:Base { 

} 

И если я называю метод Base.whatsMineType() и More.whatsMineType() оба они дали мне объект типа Base. Есть ли способ изменить метод whatsMineType(), не переопределяя его в Base, чтобы он возвращал объект типа, который вызывался?

Моя цель состоит в том, что Base.whatsMineType() будет возвращать Base объект типа и More.whatsMineType() будет возвращать More объект типа.

Я пробовал с родовыми типами, но у меня нет большого опыта с ними. Любые предложения будут оценены по достоинству.

Редактировать

Как я пытался объяснить, что это не главное найти правильный тип, а скорее, как создать экземпляр объекта с правильным.

+0

Почему бы вам не переопределить WhatsMineType в More? – WMios

+0

Поскольку у меня гораздо больше типов, которые расширяют 'Base', и я не хочу переопределять' whatsMineType() 'в каждом из них. Вот почему 'Base' для. –

+0

Возможный дубликат [Как узнать тип объекта (в Swift)?] (Http://stackoverflow.com/questions/24101450/how-do-you-find-out-the-type-of- a-object-in-swift) – WMios

ответ

0

Как вы находитесь в статическом масштабе, вы можете просто позвонить self.init(), чтобы сделать это. Вам также необходимо определить инициализатор required, чтобы гарантировать, что все подклассы могут быть построены с ним.

class Base : NSObject { 

    // mark init() as required to ensure that all subclasses can be constructed with it 
    required override init() {} 

    class func whatsMineType() -> Self { 
     return self.init() 
    } 
} 

class More : Base {} 

let b = Base.whatsMineType() 
print(type(of: b)) // Base 

let m = More.whatsMineType() 
print(type(of: m)) // More 
+0

И это то, что я искал. Спасибо :) –

+0

@JoeBlow Действительно, это было, спасибо за подсказку (у меня не хватило сил обновить все мои ответы, когда появился Swift 3 :)) – Hamish

0

Функция whatsMineType() не возвращает тип (который может быть), а объект такого типа. Все, что он делает, это инициализировать объект такого типа.

Вы должны использовать инициализатор для этого:

let base = Base() 
let more = More() 

Как это функция класса, функция является излишним, так как вам нужно вызвать его непосредственно от типа, так что вы могли бы просто использовать тип, то ,

Если вы хотите, чтобы получить тип класса передать его в качестве переменной, вы можете использовать

let baseType = Base.self 
let moreType = More.self 

Если вы хотите, чтобы создать экземпляр объекта от его типа, просто используйте

let base = baseType.init() 
let more = moreType.init() 

Но вы можете вместо этого использовать дженерики.

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