我从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文件中运行代码。
答案 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
}