为什么在下面的示例中不能使用结构的常量属性

时间:2019-08-01 08:24:24

标签: swift

我从Swift Design Patterns本书中获得了以下代码:

protocol Identifiable {
    associatedtype ID
    static var idKey: WritableKeyPath<Self, ID> { get }
}

struct Book: Identifiable {
    static let idKey = \Book.isbn
    var isbn: String
    var title: String
}

工作正常。但是,如果我为Book属性使用let而不是var来更改isbn声明,则会收到错误:Type 'Book' does not conform to protocol 'Identifiable'。因此整个错误代码如下所示:

protocol Identifiable {
    associatedtype ID
    static var idKey: WritableKeyPath<Self, ID> { get }
}

struct Book: Identifiable {    // error: Type 'Book' does not conform to protocol 'Identifiable'
    static let idKey = \Book.isbn
    let isbn: String
    var title: String
}

我很好奇为什么会这样。我尝试在Xcode Playground文件中运行代码。

1 个答案:

答案 0 :(得分:1)

这是一个WritableKeyPath-您需要对其进行写入。 它必须是变量才能写。

在Book结构中,您将使用文字实例化KeyPath。 当KeyPath不是 WritableKeyPath

时,此操作将失败

从文档中: “支持读取和写入结果值的键路径。”

意味着基础值必须是一个变量。

以下内容会编译:

import UIKit


//https://iswift.org/playground?ZEJ6cL&v=4

protocol Identifiable {
    associatedtype ID
    static var idKey: WritableKeyPath<Self, ID> { get }
}

struct Book: Identifiable {
    static let idKey = \Book.title
    let isbn: String
    var title: String
}