首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >KVC的优势

KVC的优势
EN

Stack Overflow用户
提问于 2019-05-16 10:10:40
回答 1查看 719关注 0票数 4

我想弄清楚这一点已经有一段时间了,但我无法理解KVC的优势,除了:

  1. 编译器检查(因此避免了字符串类型的代码)
  2. 与KVO连用

我不确定使用KVC是否有任何优势,除了上面提到的两个案例(我知道我可能错了),但我找不到一个!

请考虑以下代码:

代码语言:javascript
复制
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不是很好)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-24 05:18:19

您使用的示例不是使用、KVC、或keyPath本身的最佳情况。

国际海事组织,keyPath的真正力量是在你使用协议的时候释放出来的。让我举个例子-

假设您有一个协议Identifiable,它只有一个成员- id。符合此要求的每个类型都必须使用唯一标识它的id属性。

代码语言:javascript
复制
protocol Identifiable {
    var id: Int { get }
}

struct Person: Identifiable {
    var id: Int
    var name: String
}

在这里,Person类型的成员id听起来不太好。再考虑另一个-

代码语言:javascript
复制
struct Book: Identifiable {
    var id: Int
    var title: String
    var author: String 
}

在这里,一本书也可以被id唯一识别,但听起来不太好。

这是keyPath发挥作用的地方。

您可以用某个名称在协议中定义成员,并让符合的类型为该特定的协议成员编写自己的名称。一致性类型可以映射或告诉编译器,它们的特定成员是使用keyPath替换协议中的成员。

代码语言:javascript
复制
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"))

作为一个额外的优势,您的一致性类型可以有任何类型的idStringInt,而不是Int (与以前的情况一样)。

如果你只想给id一个特定的类型,比如说Int,你可以用这个代替我们协议的定义-

代码语言:javascript
复制
protocol Identifiable {
    static var id: WritableKeyPath<Self,Int> { get }
}

这将迫使符合规范的类型使用Int代替它们的id

源- 斯威夫特KeyPath -保罗哈德森

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56166096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档