我想弄清楚这一点已经有一段时间了,但我无法理解KVC的优势,除了:
我不确定使用KVC是否有任何优势,除了上面提到的两个案例(我知道我可能错了),但我找不到一个!
请考虑以下代码:
class Profile: NSObject {
@objc var firstName: String
var lastName: String
init(firstName: String,lastName: String) {
self.firstName = firstName
self.lastName = lastName
super.init()
}
}
let profile1 = Profile(firstName: "John", lastName: "Doe")
profile1.firstName // returns String "John"
profile1.value(forKey: "firstName") // returns Optional<Any>
let firstNameKey = \Profile.firstName
profile1[keyPath: firstNameKey] /* returns String "John" */我是说我为什么要用:
设firstNameKey = \Profile.firstName profile1keyPath: firstNameKey /*返回字符串"John“*/
而不是:
Profile1.first John //返回字符串"John“
如果有人有一些代码示例/示例,那么如果他们能够使用swift来解释它,那就太棒了(因为我的目标--C不是很好)
发布于 2019-05-24 05:18:19
您使用的示例不是使用、KVC、或keyPath本身的最佳情况。
国际海事组织,keyPath的真正力量是在你使用协议的时候释放出来的。让我举个例子-
假设您有一个协议Identifiable,它只有一个成员- id。符合此要求的每个类型都必须使用唯一标识它的id属性。
protocol Identifiable {
var id: Int { get }
}
struct Person: Identifiable {
var id: Int
var name: String
}在这里,Person类型的成员id听起来不太好。再考虑另一个-
struct Book: Identifiable {
var id: Int
var title: String
var author: String
}在这里,一本书也可以被id唯一识别,但听起来不太好。
这是keyPath发挥作用的地方。
您可以用某个名称在协议中定义成员,并让符合的类型为该特定的协议成员编写自己的名称。一致性类型可以映射或告诉编译器,它们的特定成员是使用keyPath替换协议中的成员。
protocol Identifiable {
associatedtype ID
static var id: WritableKeyPath<Self,ID> { get }
}
struct Person: Identifiable {
static var id = \Person.socialSecurityNumber
var socialSecurityNumber: Int
var name: String
}
struct Book: Identifiable {
static var id = \Book.isbn
var isbn: String
var title: String
var author: String
}
func printID<T: Identifiable>(aType: T) {
print(aType[keyPath: T.id])
}
printID(aType: Person(socialSecurityNumber: 1234, name: "Shubham Bakshi"))
printID(aType: Book(isbn: "qwertyui", title: "The Theory of Everything", author: "Stephen W. Hawking"))作为一个额外的优势,您的一致性类型可以有任何类型的id,String,Int,而不是Int (与以前的情况一样)。
如果你只想给id一个特定的类型,比如说Int,你可以用这个代替我们协议的定义-
protocol Identifiable {
static var id: WritableKeyPath<Self,Int> { get }
}这将迫使符合规范的类型使用Int代替它们的id。
https://stackoverflow.com/questions/56166096
复制相似问题