加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 04:39:53 所属栏目:百科 来源:网络整理
导读:Swift中有数百种假冒存在的解决方案,包括协议和Self,但它们主要是指Swift 2以及Swift 3可能带来的光明前景…… 现在Swift 4已经出局了,Generics也有很好的补充.但我找不到任何建议如何将其纳入遗失的存在问题. 任何想法如何解决这个Swift 4方式? 例: impor
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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读