这两个函数声明有区别吗?
func doSomething<T: UIViewController>(controller: T) {...}
vs.
func doSomething(controller: UIViewController) {...}
In 类型约束语法的部分苹果的 Swift 编程语言书上有这个代码示例:
func someFunction<T: SomeClass, U: SomeProtocol>(someT: T, someU: U) {
// function body goes here
}
与此描述:
上面的假设函数有两个类型参数。第一个类型参数 T 具有类型约束,要求 T 是 SomeClass 的子类。 ...
那么什么情况下使用上面描述的泛型函数更好呢?
它们是不同的,但就您使用它们的方式而言,它们几乎达到完全相同的结果。
不同之处在于,当您调用通用版本时,编译器设置T
静态地为作为参数传入的任何类型。当调用该参数的方法时,这几乎没有什么区别 - 无论哪种方式,对其方法的调用都将动态分派,并且您无法触及该参数的任何部分T
不能保证从约束中可用。
但是假设您对此方法进行了更改,不仅要接受参数,而且还要接受参数return一、同类型:
// T here will take the type of whatever is going in/out of the function
// be that UIViewController or a subtype of it
func doSomethingGenerically<T: UIViewController>(controller: T) -> T {
// some logic that results in a new controller being returned
}
// here the return type is fixed to be UIViewController
func doSomethingViaBaseClass(controller: UIViewController) -> UIViewController {
// some logic that results in a new controller being returned
}
现在,假设你有一个子类UIViewController
你正在传递,就像这样:
let subClass: MyUIViewController = ...
let controller1 = doSomethingGenerically(subClass)
let controller2 = doSomethingViaBaseClass(subClass)
这里,变量的类型controller1
将MyUIViewController
,因为这是传递给函数的内容,所以这就是T
是。但变量的类型controller2
将UIViewController
因为这是固定类型doSomethingViaBaseClass
返回。
请注意,这并不意味着它们的对象参考会有所不同 - 这取决于函数体实现的内容。这只是变量的类型指称它将改变。
还有其他细微的差异,但这是需要了解的主要差异。然而,就结构而言,还有更多值得注意的差异。碰巧我写了一篇文章昨天关于他们的事情可能会有所帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)