了解swift泛型与将参数视为协议或基类型

了解swift泛型与将参数视为协议或基类型,第1张

概述有人可以帮我理解使用泛型而不仅仅使用基类或协议的好处吗?也许我只需要阅读 Swift指南几次,但泛型的概念并没有下沉.考虑使用泛型的这个例子 func removeObject<T : Equatable>(object: T, inout fromArray array: [T]) { var index = find(array, object) array.removeAt 有人可以帮我理解使用泛型而不仅仅使用基类或协议的好处吗?也许我只需要阅读 Swift指南几次,但泛型的概念并没有下沉.考虑使用泛型的这个例子
func removeObject<T : Equatable>(object: T,inout fromArray array: [T]) {    var index = find(array,object)    array.removeAtIndex(index!)}

为什么不这样写呢?

// As pointed out,this does not compile. I was more-so curIoUs as to whyfunc removeObject(object: Equatable,inout fromArray array: [Equatable]) {    var index = find(array,object)    array.removeAtIndex(index!)}

谢谢你的解释.

更新.是的,澄清我的例子完全是假设的.我正在考虑如何在Objective-C中实现这个问题.在那,我只是传递类型ID的参数,这将做到这一点.

我的问题是为了深入了解为什么Swift中不允许使用类似的模式,而是使用泛型来代替.

在协议的情况下,它取决于协议本身.如果协议使用Self或typealias,则不能直接使用.对于任何其他协议,您可以声明协议< MyProtocol>类型的变量和参数,例如,var o:protocol< MyProtocol>.

你不能说var o:protocol< Equatable>的原因是因为Equatable协议的设计方式必须满足它声明的某些约束(在本例中为Self),因此它只能用作泛型类型约束.换句话说,编译器必须能够在编译时弄清楚Self是关于Equatable的任何东西,并且它不能(总是)在var o:protocol< Equatable>中做到这一点.

为什么使用泛型而不是协议或基类?因为泛型可以比那些仍然是类型安全的更普遍.这特别有用,回调之类的东西.这是一个非常人为的例子:

class Useless<T> {    private let o: T    private let callback: (T,String) -> VoID    required init(o: T,callback: (T,String) -> VoID) {        self.o = o        self.callback = callback    }    func publish(message: String) {        callback(o,message)    }}var useless = Useless(o: myObject) { obj,message in   // Here in the callback I get type safety.    obj.someMethod(message)}

(此代码从未被任何人运行过.它应被视为伪代码.)

现在,由于很多原因,这是一个非常愚蠢的例子,但它说明了这一点.由于泛型,回调的obj参数完全是类型安全的.这无法通过基类或协议来完成,因为我们永远无法预测回调中可能会调用哪些代码.无用类可以采用任何类型作为其T.

总结

以上是内存溢出为你收集整理的了解swift泛型与将参数视为协议或基类型全部内容,希望文章能够帮你解决了解swift泛型与将参数视为协议或基类型所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1032517.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存