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()
我有 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()