我正在使用带有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年出版。
答案 0 :(得分:4)
在Swift 4中,出于性能原因,不再推断将代码公开给Objective-C运行时。
为了避免崩溃,您必须显式添加@objc
属性。
@objc var name: String = ""
但是从Swift的强类型角度来看,有两种更好的方法来使用KVC获取值:
#keyPath
指令也使用ObjC运行时,但在编译时检查键路径
let keyPath = #keyPath(Student.name)
student1.setValue("Benny", forKeyPath: keyPath)
在这种情况下,您会得到非常有描述性的编译器警告
“#keyPath”的参数引用“ Student”中的属性“ name”,该属性取决于Swift 4中弃用的“ @objc”推论
(推荐的)本机方式:Swift 4+提供了自己的KVC模式,其中不需要子类NSObject
。
关键路径由反斜杠开头,后跟类型和属性(一个或多个):
class Student {
var name: String = ""
var gradeLevel: Int = 0
}
let student1 = Student()
student1[keyPath: \Student.name] = "Benny"