2015-06-03 6 views
1

Я просто подумал об этом, пытаясь выяснить, что такое Swift. Я придумал следующий тестовый код, где я бы хотел позвонить f(). Я не могу понять, как я могу сообщить компилятору, что T в этом случае Classy.Как я могу назвать эту общую функцию?

protocol Prot { 
    func doSomething() 
    static func instance() -> Prot 
} 

class Classy: Prot { 

    func doSomething() { 
     print("here") 
    } 

    static func instance() -> Prot { 
     return Classy() 
    } 
} 

func f<T: Prot>() { 
    T.instance().doSomething() 
} 

f() // error 
f<Classy>() // error 

ответ

1

@Roman Sausarnes' является правильным, но вместо того, чтобы метод instance, вы могли бы вместо того, чтобы использовать Инициализатор:

protocol Prot { 
    func doSomething() 
    init() 
} 

class Classy: Prot { 
    func doSomething() { 
     println("Did something") 
    } 

    // The required keyword ensures every subclass also implements init() 
    required init() {} 
} 

func f<T: Prot>(Type: T.Type) { 
    Type().doSomething() 
} 

f(Classy.self) // Prints: "Did something" 
4

Попробуйте это:

f<T: Prot>(t: T.Type) { 
    t.instance().doSomething() 
} 

f(Classy.self) 

Я не в том месте, где я могу проверить это прямо сейчас, но я использовал эту технику в прошлом, и это сработало. Ответ

+2

Попробуйте снова с '.self' –

+0

хорошего вызова, и спасибо за фиксирование ответ.... –

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