iOS,在swift中使用符合objc协议的变量

iOS, use a variable that conforms to objc protocol in swift

我有 MyObjcClass 类型的成员变量 UIView<FooProtocol>* myView

MySwiftClass 扩展 MyObjcClass 并尝试使用 myView.

myView.doFoo() 是 swift 中的错误,因为 swift 将 myView 视为 UIView 而不是 UIView<FooProtocol>

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

我认为从 UIView<FooProtocol>* 到 Swift 没有很好的直接映射。你最好的选择可能只是抛出它然后跟注:

(myView as! FooProtocol).doFoo()

如果您可以控制 objective-c class,将 myView 重新定义为 FooProtocol 可能会更容易:

id<FooProtocol> myView;

或者,在基 class 中定义一个为您调用 doFoo 的方法:

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

在这种情况下,您可以只使用 swift:

中的基础 class 方法
self.doFoo()