2017-03-11 3 views
3

j'ai un protocole aléatoire comme exempleSwift 3. Toute Cast à la classe qui est conforme protocole spécifique

protocol testP { 
    init(param1: String) 
} 

Et j'ai une classe, qui prennent Any comme paramètre comme exemple:

class testC { 
    var aClass: Any 
} 

Comment puis-je vérifier si aClass est conforme au protocole testP et si c'est le cas, créer un nouvel objet en utilisant l'initialiseur de protocole, par exemple:

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

S'il vous plaît, aidez-

+1

Attribuez-vous une instance d'un type conforme à 'testP' à' aClass' ou attribuez-vous le métatype d'un type conforme à 'testP'? – Hamish

+0

Le but de ce type de protocole n'est-il pas d'écrire 'var aClass: testP' pour faire toutes ces vérifications au moment de la compilation? – vadian

Répondre

1

Vous pouvez tester comme un autre type de vérification avec 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") 
} 

Par ailleurs, si vous attribuez uniquement les types de classes à aClass, envisagez d'utiliser AnyClass ou Any.Type.

+0

Merci! Fonctionne parfaitement –