2015-11-06 70 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