gpt4 book ai didi

generics - Swift 广义存在

转载 作者:行者123 更新时间:2023-12-04 15:08:37 25 4
gpt4 key购买 nike

除了多余的介绍,我想要这样的东西:

let collection : Any<Sequence where .Iterator.Element == String> = ...

或者
let collection : Sequence<where .Iterator.Element == String> = ...

这在 Apple's Generics Manifesto 中被称为“广义存在”。 . (我认为)我真的需要这个用于许多用例,这个:

protocol 'P' can only be used as a generic constraint because it has Self or associated type requirements.



使“第一个面向协议(protocol)的语言”对我来说理解起来很麻烦。缺乏这一点让我与 Swift 的类型系统作斗争,并创建了不利的通用“抽象”类,其中应该有一个带有 associatedtype 的协议(protocol).

这是一个让我印象最深刻的例子,它是一个泛型类的委托(delegate):
protocol GenericClassDelegate : class {
associatedtype ItemType
func didDoThat(who : GenericClass<ItemType>)
}

class GenericClass<T> {
weak var delegate : GenericClassDelegate<where .ItemType == T>? // can't do that

func notify() {
delegate?.didDoThat(who: self)
}
}

虽然我可以描述 GenericClassDelegate协议(protocol),我(目前在 Swift 3 中)不能有该类型的变量或常量(或任何符合限制的类型)。

不要将此问题与 How to use generic protocol as a variable type 混淆。或 Swift delegate protocol for generic class ,如 我的问题是:
  • 目前是否有任何关于将广义存在主义引入 Swift 的提案或讨论,有什么计划?如果没有,我如何参与和影响这个?
  • 如果 Swift 是这样设计的(有关联类型,但没有广义存在),也许它意味着一些架构转变。我期望用什么来代替委托(delegate)模式?

  • 附言当您在闭包中捕获委托(delegate)的函数时,不要建议使用类型删除的 thunk,这非常错误和误导,我什至称它为拐杖。

    意外找到了另一种解决方案,但我对此并不完全满意:
    protocol GenericClassDelegate : class {
    associatedtype ItemType
    func didDoThat(who : GenericClass<ItemType, Self>)
    }

    class GenericClass<T, Delegate : GenericClassDelegate> where Delegate.ItemType == T {
    weak var delegate : Delegate?

    func notify() {
    delegate?.didDoThat(who: self)
    }

    init(_ delegate : Delegate?) {
    self.delegate = delegate
    }
    }

    // Delegates must be final classes, otherwise it does not compile
    // because I used Self in GenericClassDelegate
    final class GenericClassDelegateImp<T> : GenericClassDelegate {
    typealias ItemType = T
    func didDoThat(who: GenericClass<T, GenericClassDelegateImp>) {
    print(who)
    }
    }

    // Usage:
    var delegate = GenericClassDelegateImp<Int>()
    var genericClass = GenericClass<Int, GenericClassDelegateImp<Int>>(delegate)

    最佳答案

    Are there any proposals or discussions currently present on introducing Generalized Existentials into Swift, what are the plans? If no, how can I participate and affect this?



    这是一个普遍要求的功能,并且已经有关于 swift-evolution 的初步设计工作。但此时此刻,核心团队和社区正在关注影响 ABI 稳定性的特性,也就是 Lattner 定义的“Swift 4 Phase 1”。

    当第 2 阶段开始时,您肯定会听到更多有关它的信息。鉴于其受欢迎程度,预计它将成为 Swift 4 的一部分。

    If Swift was designed that way (with Associated Types, but without Generalized Existentials), maybe it implies some architectural shift. What am I expected to replace delegation pattern with?



    您可以使用类型删除包装器作为传递解决方案。通常,它利用类的动态分派(dispatch)和继承来删除类型。
    protocol Fancy {
    associatedtype Value
    var value: Value
    }

    struct FancyMatter<Value> {
    let value: Value
    }

    class AnyFancyBoxBase<P: FancyProtocol>: AnyFancyBox<P.Value> {
    let base: P
    override var value: P.Value { return base.value }
    init(_ base: P) { self.base = base }
    }

    class AnyFancyBox<Value> {
    var value: Value { fatalError() }
    }

    var box: AnyFancyBox<Int> = AnyFancyBoxBase(FancyMatter(1))

    你可以看看 how the Standard Library implements type-erased wrappers .

    关于generics - Swift 广义存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39469388/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com