如何使用Swift 4.2了解KVC

时间:2018-10-03 20:36:50

标签: swift kvc

我正在使用带有Swift 4.2的Xcode 10.0来从“ OSX的可可编程”中了解键值编码

要求我创建一个简单的类,它是NSObject的子类。以下代码:

import Cocoa

class Student: NSObject {
    var name: String = ""
    var gradeLevel: Int = 0
}

let student1 = Student()


student1.setValue("Benny", forKeyPath: "name")

student1.setValue(“ Benny”,forKeyPath:“名称”)

生成以下错误消息:

  

执行被中断,原因:EXC_BAD_INSTRUCTION(代码= EXC_I386_INVOP,子代码= 0x0)。

我看了网上,似乎发现了一些有关KVC的问题,例如: https://bugs.swift.org/browse/SR-5139

我在做什么错?这本书于2015年出版。

1 个答案:

答案 0 :(得分:4)

在Swift 4中,出于性能原因,不再推断将代码公开给Objective-C运行时。
为了避免崩溃,您必须显式添加@objc属性。

@objc var name: String = ""

但是从Swift的强类型角度来看,有两种更好的方法来使用KVC获取值:

  1. #keyPath指令也使用ObjC运行时,但在编译时检查键路径

    let keyPath = #keyPath(Student.name)
    student1.setValue("Benny", forKeyPath: keyPath)
    

    在这种情况下,您会得到非常有描述性的编译器警告

      

    “#keyPath”的参数引用“ Student”中的属性“ name”,该属性取决于Swift 4中弃用的“ @objc”推论

  2. (推荐的)本机方式:Swift 4+提供了自己的KVC模式,其中不需要子类NSObject
    关键路径由反斜杠开头,后跟类型和属性(一个或多个):

    class Student {
        var name: String = ""
        var gradeLevel: Int = 0
    }
    
    let student1 = Student()
    student1[keyPath: \Student.name] = "Benny"