gpt4 book ai didi

generics - 在 Swift 中扩展所有类型?

转载 作者:搜寻专家 更新时间:2023-10-31 08:21:39 25 4
gpt4 key购买 nike

浏览 Swift 的库代码我发现:

extension T! : Printable {
var description: String { get }
}

该代码段似乎使用“描述”字段扩展了所有类型。当我尝试在我的代码中做同样的事情时,出现错误:

example.swift:10:11: Non-nominal type 'T!' cannot be extended

protocol MyProtocol {
// ...
}

extension T! : MyProtocol { // error: Non-nominal...
// ...
}

类似的问题在:

但他们未能解决:

  • 这是怎么回事?为什么库代码没问题,但我的代码……不行?
  • 是否可能所有类型或所有类型都符合特定协议(protocol)?

最佳答案

首先,它并没有扩展所有的类型。它扩展了 T! ,即 ImplicitlyUnwrappedOptional<T> .所以它扩展了隐式展开的可选类型,而不是所有类型。

“ header ”并不是真正的 Swift 代码;它是自动生成的。自动 header 生成器中可能存在错误,导致它在某些情况下无法生成真正的 Swift 代码。不要从字面上理解它。

您在自动生成的“ header ”中注意到的一件奇怪的事情是某些内置语法收缩的应用不一致——类型声明不使用收缩,但扩展使用:

struct Array<T>
extension T[]

enum Optional<T>
extension T?

struct ImplicitlyUnwrappedOptional<T>
extension T!

可能自动 header 生成器中的一些代码过于贪婪地用它们的约定语法替换了上述类型。所以首先我们假设 extension T!实际上说 extension ImplicitlyUnwrappedOptional<T> .

然而,extension ImplicitlyUnwrappedOptional<T>也不编译,出现错误“使用未声明的类型‘T’”。事实上,在自动生成的“header”中,我们看到了很多带有类型参数的扩展声明实例,例如extension Dictionary<KeyType, ValueType> ,不会在 Swift 中编译。这是自动生成 header 的另一个错误。

但是删除类型参数是可行的:

extension ImplicitlyUnwrappedOptional : MyProtocol {
// ...
}

这正是 this answer 中显示的内容.

关于generics - 在 Swift 中扩展所有类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24393787/

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