2015-11-06 29 views
0

可变我有MyObjcClass类型的成员变量UIView<FooProtocol>* myViewiOS的,使用符合objc协议在迅速

MySwiftClass延伸MyObjcClass,并尝试使用myView

myView.doFoo()是迅速的错误,因为迅速看到myViewUIViewUIView<FooProtocol>

+0

声明您的myView的类型... var myView:protocol user3441734

回答

0

我不认为有从UIView<FooProtocol>*斯威夫特一个很好的直接映射。最好的办法是可能只是投它,然后拨打电话:

(myView as! FooProtocol).doFoo() 

如果你有在Objective-C类控制,它可能更容易重新定义MyView的是FooProtocol:

id<FooProtocol> myView; 

或者,定义在基类中调用doFoo你一个方法:

-(void)doFoo { 
    [myView doFoo]; 
} 

在这种情况下,你可以使用基类的方法从SWIFT:

self.doFoo() 
+0

检查我的更新答案。 – user3441734

-1
protocol FooProtocol { 
    func foo() 
} 
class BaseFoo { 

} 
class Foo: BaseFoo, FooProtocol { 
    func foo() { 
     print("job as required by FooProtocol") 
    } 
} 

class MyClass { 
    var myFoo: Foo = Foo() 
    var myFoo2: BaseFoo = Foo() 
    // I dont have an idea about the type, but i know it comforms to FooProtocol 
    var myFoo3: protocol<FooProtocol> = Foo() 
} 

let myClass: MyClass = MyClass() 
myClass.myFoo.foo()  // job as required by FooProtocol 
//myClass.myFoo2.foo() // error: value of type 'BaseFoo' has no member 'foo' 
myClass.myFoo3.foo() // job as required by FooProtocol 
+0

在原始问题中,基类起源于objective-c。在Swift中展示一切的例子并不能真正回答这个问题。 –

+0

你仍然错过了原来的问题。在目标C中,声明“UIView * myView;”表明myView是UIView(或其子类)的任何实例,它们也实现了FooProtocol。它允许访问FooProtocol和UIView方法。这样的机制在Swift中不存在,所以它只是被翻译成'var myView:UIView',失去了与'FooProtocol'的关系,所以'doFoo'不再可以直接访问。这不是关于如何在Swift中纯粹做某些事情的问题,而是如何在ObjC和Swift之间提供互操作性的问题。 –

+0

感谢您的解释!现在对我来说很清楚。对不起... – user3441734