我有一个项目,我想在其中以某种方式通过 struct 进行记录.每个 struct 都应该有一个返回字符串的静态方法文档.我想为Array编写一个扩展,这样我就可以在符合我的协议的对象数组上调用该函数,但它不起作用.

到目前为止,我得到了这样的结论:

protocol Documentable {
  static func document() -> String
}

extension Array: Documentable where Element == Documentable {
  static func document() -> String {
    guard let casted = Element.Type.self as? Documentable.Type else {
      return "didn't work..."
    }

    return "[\(casted.document()), ...]"
  }
}

struct StructA: Documentable {
  static func document() -> String {
    return "a"
  }
}

// approach 1
// this leads to "didn't work..."
let a = Array<StructA>()
print(type(of: a).document())

// approach 2
// referencing static method 'document()' on 'Array' requires the types 'StructA' and 'any Documentable' be equivalent
let b = Array<StructA>.self
print(b.document())

方法1编译,但会导致运行时错误,因为强制转换不知何故不起作用,我觉得这没有什么意义,因为Element必须符合我的协议,所以强制转换应该总是有效的.

方法2编译时没有显示以下消息:

referencing static method 'document()' on 'Array' requires the types 'StructA' and 'any Documentable' be equivalent

这也很奇怪,因为StructA确实符合我的协议.

这可能与this有关,但我不知道该怎么做.

推荐答案

您的代码在单一的Array<Document>类型上添加了一个扩展名,而不是为符合Document的所有T添加了Array<T>.

Element.document()显然不能为Array<Document>而存在.由于ElementDocument相同,因此Element.document()没有实现.另请参见the post you linked.

你应该把==改成:.这可能就是你想要做的.

extension Array: Documentable where Element: Documentable {
    static func document() -> String {
        "[\(Element.document()), ...]"
    }
}

现在你可以做Array<StructA>.document(),它将返回"[a, ...]".

Swift相关问答推荐

Form中的Divider在macOS上并不完全扩展

同步问题,发送Api Call之前未设置idToken

动画过程中的SwiftUI重绘视图

从Firebase播放音频文件不起作用

以编程方式使UIView居中,而不影响UIKit中其他UI类的位置

关闭 SwiftUI TabView 中的子视图

(Swift)混淆了函数内 for-in 循环的返回值和循环后(函数内)的返回值)

在PrimitiveSequence上引用实例方法xxx需要类型A和any B等效

如何返回一个通过 SwiftUI 中的另一个协议间接继承 View 协议的 struct ?

使用 swift 的 Firebase 身份验证

如何在 AppDelegate for Cocoa macOS 中创建 mainMenu 和菜单项?

如何在不将变量转换为字符串的情况下判断变量在 Swift 中是否为 Optional(nil)?

如何在 Swift 中的两个 UIView 中心之间添加线?

如何将回调传递给 View init

如何快速制作虚线?

即使设置为从不也可以访问 iOS11 照片库

使 struct 可散列?

UILabel 文本不换行

WKWebView 确实从本地文档文件夹加载资源

在 Swift 中从服务器播放视频文件