2015-06-26 6 views
1

Я пытаюсь динамически создать тип экземпляра класса с использованием дженериков, однако я столкнулся с каким-то странным поведением. В примере 1 все работает, но в примере 2, если я передаю Test.self на общую функцию, это не сработает. Тип тот же, все одно и то же, я не понимаю, почему.Передача быстрого класса в универсальную функцию

class Test{ 
    required init(x: Int){ 
    // Do Something 
    } 
} 

class Builder{ 
    init(){ 
    } 

    func use<T>(test2: T.Type) -> Void{ 
    test2(x: 10) // Error: T cannot be constructed because it has no accessible initializers 
    } 
} 

// Example 1: 
let test1 = Test.self 
test1(x: 10) 

// Example 2: 
let builder = Builder() 
builder.use(Test.self) 

ответ

2

Это потому, что T не типа Test. Чтобы это исправить:

class Builder{ 
    init(){ 
    } 

    // T has to be of type Test or is a subclass of Test 
    func use<T: Test>(test2: T.Type) -> Void{ 
    test2(x: 10) 
    } 
} 
2

При определении функции use<T>, вы должны сообщить ему как-то, что класс вы передаете будет иметь init(x:) конструктор.

Вы можете сделать это, объявив протокол, и сделайте необязательный тип T соответствующим этому протоколу.

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

protocol TestProtocol { 
    init(x:Int) 
} 

class Test: TestProtocol { 
    required init(x: Int){ 
     // Do Something 
    } 
} 

class Builder{ 
    init(){ 
    } 

    func use<T: TestProtocol>(test2: T.Type) -> TestProtocol { 
     return test2(x: 10) 
    } 
} 

PD: протестирован на Swift 1.2