Swift 3. Приведите Any к классу, который соответствует определенному протоколу

У меня есть случайный протокол в качестве примера

protocol testP {
    init(param1: String)
}

И у меня есть класс, который принимает Any в качестве параметра, например:

class testC {
    var aClass: Any
}

Как я могу проверить, соответствует ли aClass протоколу testP, и если да, то создать новый объект с помощью инициализатора протокола, например:

let newObject = aClass(param1: "Hello World!")

Пожалуйста помоги


person Yury Loginov    schedule 11.03.2017    source источник
comment
Вы назначаете экземпляр типа, который соответствует testP, для aClass, или вы назначаете метатип типа, который соответствует testP?   -  person Hamish    schedule 11.03.2017
comment
Разве цель такого протокола не в том, чтобы написать var aClass: testP для выполнения всех этих проверок во время компиляции?   -  person vadian    schedule 11.03.2017


Ответы (1)


Вы можете проверить это как проверку другого типа с помощью if-let:

protocol TestP {
    init(param1: String)
}

class TestC {
    var aClass: Any

    init(_ aClass: Any) {
        self.aClass = aClass
    }
}

class MyClassA: TestP {
    required init(param1: String) {
        //
    }
}

class MyClassB {

}

let containerA = TestC(MyClassA.self)

let containerB = TestC(MyClassB.self)

if let testPType = containerA.aClass as? TestP.Type {
    var a = testPType.init(param1: "abc")
    print(a) //->MyClassA
}

if let testPType = containerB.aClass as? TestP.Type {
    print("This print statement is not executed")
}

Кстати, если вы назначаете только типы классов для aClass, рассмотрите возможность использования AnyClass или Any.Type.

person OOPer    schedule 11.03.2017
comment
Спасибо! Работает отлично - person Yury Loginov; 11.03.2017