将参数传递给实现协议并在 swift 中扩展 class 的方法
Passing parameter to method which implements protocol and extends a class in swift
在 Objective-C 中,您可以通知编译器类型应该是特定 class 的后代,并且还符合协议(例如 "UIViewController *foo = nil")。
我正在尝试用 Swift 做一些类似的事情,看起来这需要使用泛型。这是我期望的工作:
import UIKit
protocol MyProtocol {
var foo: String {get set}
}
class MyViewController: UIViewController, MyProtocol {
var foo: String = ""
}
func doAThing<T: UIViewController where T: MyProtocol>(vc: T) -> T? {
var myViewController: T? = nil
myViewController = MyViewController(nibName: nil, bundle: nil)
return myViewController
}
我得到的错误是:'MyViewController' 无法转换为 'T'。我不能将泛型与 "concrete"、未参数化的 class 一起使用吗?我仍在思考这部分语言,感谢您的帮助。
假设您希望 MyViewController
是实现 MyProtocol
的 UIViewController
的任何子类 请注意,确实没有一种干净的方法可以返回 UIViewController
没有添加与协议相关的任何内容的方法。
我想你要找的是:
protocol MyProtocol {
var foo: String {get set}
}
class MyViewController: UIViewController, MyProtocol {
var foo: String = ""
}
class MyOtherViewController : UIViewController, MyProtocol {
var foo = "My other view controller"
}
func doAThing<T: UIViewController where T: MyProtocol>() -> T? {
return T(nibName: nil, bundle: nil)
}
let myViewController : MyViewController? = doAThing()
let myOtherViewController : MyOtherViewController? = doAThing()
let myProtocol : MyProtocol? = myViewController
由于 swift 函数覆盖仅允许 return 类型不同,并且类型推断能够在它们之间进行选择,因此 doAThing
在此并不需要参数案例.
在 Objective-C 中,您可以通知编译器类型应该是特定 class 的后代,并且还符合协议(例如 "UIViewController *foo = nil")。
我正在尝试用 Swift 做一些类似的事情,看起来这需要使用泛型。这是我期望的工作:
import UIKit
protocol MyProtocol {
var foo: String {get set}
}
class MyViewController: UIViewController, MyProtocol {
var foo: String = ""
}
func doAThing<T: UIViewController where T: MyProtocol>(vc: T) -> T? {
var myViewController: T? = nil
myViewController = MyViewController(nibName: nil, bundle: nil)
return myViewController
}
我得到的错误是:'MyViewController' 无法转换为 'T'。我不能将泛型与 "concrete"、未参数化的 class 一起使用吗?我仍在思考这部分语言,感谢您的帮助。
假设您希望 MyViewController
是实现 MyProtocol
的 UIViewController
的任何子类 请注意,确实没有一种干净的方法可以返回 UIViewController
没有添加与协议相关的任何内容的方法。
我想你要找的是:
protocol MyProtocol {
var foo: String {get set}
}
class MyViewController: UIViewController, MyProtocol {
var foo: String = ""
}
class MyOtherViewController : UIViewController, MyProtocol {
var foo = "My other view controller"
}
func doAThing<T: UIViewController where T: MyProtocol>() -> T? {
return T(nibName: nil, bundle: nil)
}
let myViewController : MyViewController? = doAThing()
let myOtherViewController : MyOtherViewController? = doAThing()
let myProtocol : MyProtocol? = myViewController
由于 swift 函数覆盖仅允许 return 类型不同,并且类型推断能够在它们之间进行选择,因此 doAThing
在此并不需要参数案例.