泛型函数中使用的符合协议和 class 类型的变量
Variable of type that conforms to protocol and class used in generic function
我要声明一个变量
var specialVC: UIViewController & MyProtocol.
我有一个功能
func doStuff<T: UIViewController & MyProtocol> { ... }
但是,当我尝试将我的变量传递给 doStuff 时,它说 UIViewController 不符合 MyProtocol。
class MyClass: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
var specialVC: UIViewController & MyProtocol
doStuff(specialVC)
}
func doStuff<T: UIViewController & MyProtocol>(_ vc: T) {}
}
错误:
Argument type 'UIViewController' does not conform to expected type 'MyProtocol'
---更新---
查看 后,我能够创建一个扩展,指定符合协议的 class。但是,我无法从此扩展调用 doStuff()。
internal extension MyProtocol where Self: UIViewController {
// call doStuff(self) here somehow?
}
您的函数没有任何需要通用的地方。只需使用普通的类型和超类型机制(多态性、继承,随便你怎么称呼它)。只需键入您的参数作为超类型;这告诉编译器它继承了超类型的所有特性。
protocol MyProtocol : UIViewController { // Swift 5 syntax
var thingy : String { get set }
}
class MyViewController : UIViewController, MyProtocol {
var thingy = "howdy"
}
func doStuff(_ vc: MyProtocol) {
print(vc.title) // legal, because we know it's a view controller
print(vc.thingy) // legal, because we know it's a MyProtocol
}
我要声明一个变量
var specialVC: UIViewController & MyProtocol.
我有一个功能
func doStuff<T: UIViewController & MyProtocol> { ... }
但是,当我尝试将我的变量传递给 doStuff 时,它说 UIViewController 不符合 MyProtocol。
class MyClass: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
var specialVC: UIViewController & MyProtocol
doStuff(specialVC)
}
func doStuff<T: UIViewController & MyProtocol>(_ vc: T) {}
}
错误:
Argument type 'UIViewController' does not conform to expected type 'MyProtocol'
---更新---
查看
internal extension MyProtocol where Self: UIViewController {
// call doStuff(self) here somehow?
}
您的函数没有任何需要通用的地方。只需使用普通的类型和超类型机制(多态性、继承,随便你怎么称呼它)。只需键入您的参数作为超类型;这告诉编译器它继承了超类型的所有特性。
protocol MyProtocol : UIViewController { // Swift 5 syntax
var thingy : String { get set }
}
class MyViewController : UIViewController, MyProtocol {
var thingy = "howdy"
}
func doStuff(_ vc: MyProtocol) {
print(vc.title) // legal, because we know it's a view controller
print(vc.thingy) // legal, because we know it's a MyProtocol
}