gpt4 book ai didi

Swift:类型别名和协议(protocol)中具有值的关联类型有什么区别?

转载 作者:行者123 更新时间:2023-11-28 11:35:05 26 4
gpt4 key购买 nike

在 Swift 中,以下代码可以毫无问题地编译。

protocol P1 {
associatedtype T = Int
}

protocol P2 {
typealias T = Int
}

对我来说,它们的行为似乎几乎相同。我注意到的唯一区别是,对于何时可以使用 P1 有额外的限制,因为它具有关联类型。特别是,let x: P1 是一个错误,而 let x: P2 是正确的。

这两个协议(protocol)之间的实际区别是什么?它们在编译后的代码中有区别对待吗?最后,使用 P1 而不是 P2 是否有优势?

为清楚起见编辑:

我知道关联类型和类型别名之间的工作区别,所以我很惊讶你甚至可以给关联类型一个固定值。这似乎违背了关联类型的全部目的。我想知道是否有任何实用程序可以为关联类型提供固定值,并且我想知道这两个协议(protocol)在编译后是否不同。

最佳答案

在您编写的代码中,实际上并没有功能差异,因为您已将 associatedtype 设置为 Int

为了更强大地使用它们,您可以使用 associatedtype 作为伪通用约束。

所以你可能会这样写......

protocol P1 {
associatedtype Item: Equatable
var itemArray: [Item] { get set }
mutating func add(item: Item)
}

extension P1 {
mutating func add(item: Item) {
itemArray.append(item)
}
}

struct StructWithStrings: P1 {
var itemArray: [String]
}

struct StructWithInts: P1 {
var itemArray: [Int]
}

因为它们都符合 P1,并且都将它们的数组类型设置为 Equatable 类型。编译器可以推断出 add(item: Item) 函数的正确类型,并在编译时提供帮助。

与此相反... typealias 只是为了方便而真正用于更改某种类型的名称。例如,您可能会像这样使用闭包... (Data?, Error?, URLResponse) -> () 多次编写它会很长,但也会失去一些意义.所以你可以做...

typealias DownloadResponse = (Data?, Error?, URLResponse) -> ()

并将所有用法替换为DownloadResponse

关于 Swift 中的 associatedtype 有很多优秀的资源...

  1. Hacking With Swift
  2. Natasha the Robot
  3. Medium

关于Swift:类型别名和协议(protocol)中具有值的关联类型有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55622136/

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