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
