Swift中有数百种假冒存在的解决方案,包括协议和Self,但它们主要是指Swift 2以及Swift 3可能带来的光明前景…… 现在Swift 4已经出局了,Generics也有很好的补充.但我找不到任何建议如何将其纳
现在Swift 4已经出局了,Generics也有很好的补充.但我找不到任何建议如何将其纳入遗失的存在问题.
任何想法如何解决这个Swift 4方式?
例:
import UIKit protocol Bla { func compare(other: Self) } extension CGFloat : Bla { func compare(other: CGFloat) { print("Extended CGFloat") } } extension UIEdgeInsets : Bla { func compare(other: UIEdgeInsets) { print("Extended UIEdgeInsets") } } /* Possible, but what if we want to CGFloat _and_ UIEdgeInsets inside here? Well, that would _not_ work! */ class Possible<T: Bla> { var array: [T]! } /* This is open to everything... And therefore fails to compile, no dynamic type info at runtime I guess. */ class Fail { var array: [Bla]! } // Works, but I don't need that. let list = Possible<CGFloat>() // I need that: let list = Fail() let f: CGFloat = 1.23 let edge = UIEdgeInsets() list.array.append(f) list.array.append(edge)Swift 4没有进行任何针对此问题的泛型更改.有关完整的路线图,请参阅 Generics Manifesto.也就是说,您所描述的协议等同于Equatable,因此会遇到所有相同的问题.目前没有创建您所描述内容的路线图.最接近的是在宣言的最后,在“开放存在”一节中讨论.
正如您所描述的那样,目前尚不清楚它是如何有用的,所以我怀疑您的实际问题是不同的.你应该回到你的实际计划,并考虑它的真正需求.例如,如果你的真正需求是“一个CGFloat或UIEdgeInsets数组”,它绝对可以在Swift中构建. “数组”转换为[T],“或”转换为枚举(类型理论用语中的斯威夫特的“和类型”).所以你的意思是:
enum Element { case scalar(CGFloat) case insets(UIEdgeInsets) } let list: [Element]
这与“可以与自己比较的一系列事物”完全不同.另一方面,如果你的意思是“一系列有价值的东西”,那么使用NSValue(及其子类,NSNumber)构建Swift也很容易:
class Things { var array: [NSValue] = [] func append(_ value: CGFloat) { array.append(NSNumber(value: Double(value))) } func append(_ insets: UIEdgeInsets) { array.append(NSValue(uiEdgeInsets: insets)) } } let list = Things() let f: CGFloat = 1.23 let edge = UIEdgeInsets() list.append(f) list.append(edge) list.array[0] == list.array[0] // true list.array[0] == list.array[1] // false