当前位置 : 主页 > 手机开发 > 其它 >

Swift 4通过协议和“Self”伪造存在的方式

来源:互联网 收集:自由互联 发布时间:2021-06-11
Swift中有数百种假冒存在的解决方案,包括协议和Self,但它们主要是指Swift 2以及Swift 3可能带来的光明前景…… 现在Swift 4已经出局了,Generics也有很好的补充.但我找不到任何建议如何将其纳
Swift中有数百种假冒存在的解决方案,包括协议和Self,但它们主要是指Swift 2以及Swift 3可能带来的光明前景……
现在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
网友评论