2015-05-11 2 views
0

Я новичок в коде Swift и сожалею о моем плохом английском. Вот мой код:SWIFT - Как сравнить экземпляр массива с протоколом

var t = Array<MyClassProtocol>() 
var instance1 = MyClasse() //protocol MyClassProtocol 
var instance2 = MyClasse() //protocol MyClassProtocol 
var instance3 = MyClasse2() //protocol MyClassProtocol 
t.append (instance1) 
t.append (instance2) 
t.append (instance3) 

//What I try to do 

for instance in t 
{ 
    if (instance === instance1){ /* do something */ } 
} 

XCode возвращение: тип MyClassProtocol не соответствует протоколу "AnyObject"

Любая идея? Благодаря

+0

Можем ли мы также ознакомиться с классами MyClasse и MyClasse2 –

ответ

-1

Ваши классы должны будут Для реализации MyClassProtocol для протокола

например

class MyClasse: NSObject, MyClassProtocol 
         ^Here we tell the class that it should implement the protocol 

Подобно тому, как в сторону, вы можете также объявлять массивы, как это:

var t : [MyClassProtocol] = []; 
0

Вы должны позволить MyClassProtocol наследовать от AnyObject

protocol MyClassProtocol : AnyObject { 

} 
0

Я думаю, что вы не MyclassProtocol наследовать от AnyObject. , так что попробуйте это: возможно, работа.

protocol MyClassProtocol:AnyObject{ // make sure you protocol inherit from AnyObject 
func doSomething() 
} 




class Myclass:MyClassProtocol{ 
func doSomething() { 

} 
} 

class Myclass2: MyClassProtocol { 
func doSomething() { 

} 
} 
var t = Array<MyClassProtocol>() 
var instance1 = Myclass() //protocol MyClassProtocol 
var instance2 = Myclass() //protocol MyClassProtocol 
var instance3 = Myclass2() //protocol MyClassProtocol 
t.append (instance1) 
t.append (instance2) 
t.append (instance3) 


for instance in t{ 
    if (instance === instance1){ 

} 
} 
+0

Это работает! Большое спасибо. Это просто, когда вы знаете! – jerome

1

Оператор === может применяться только к экземплярам классов. Однако Swift имеет не только классы, но и структуры. Структуры также могут принимать MyClassProtocol. Проблема в том, что когда Swift видит instance только как MyClassProtocol, он не знает, является ли это структурой или классом, поэтому вы не можете использовать ===.

Чтобы решить эту проблему, вам необходимо предотвратить использование MyClassProtocol structs. Это делается путем присвоения ему наследования от AnyObject (который является пустым протоколом класса).

protocol MyClassProtocol : AnyObject { 
Смежные вопросы