如何通过 swift 4.2 了解 KVC
How to learn about KVC with swift 4.2
我正在使用 Xcode 10.0 和 swift 4.2 从 "Cocoa programming for OSX"
了解键值编码
我被要求创建一个简单的 class,它是 NSObject 的子class。以下代码:
import Cocoa
class Student: NSObject {
var name: String = ""
var gradeLevel: Int = 0
}
let student1 = Student()
student1.setValue("Benny", forKeyPath: "name")
student1.setValue("Benny", forKeyPath: "name")
生成以下错误消息:
Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0).
我在网上看了一些关于 KVC 的问题,例如:
https://bugs.swift.org/browse/SR-5139
我做错了什么?该书于 2015 年出版。
在 Swift 4 中,出于性能原因不再推断向 Objective-C 运行时公开代码。
为避免崩溃,您必须明确添加 @objc
属性。
@objc var name: String = ""
但是从 Swift 的强类型角度来看,有两种更好的方法可以使用 KVC 获取值:
#keyPath
指令也使用 ObjC 运行时,但在编译时检查关键路径
let keyPath = #keyPath(Student.name)
student1.setValue("Benny", forKeyPath: keyPath)
在这种情况下,您会收到一个非常具有描述性的编译器警告
Argument of '#keyPath' refers to property 'name' in 'Student' that depends on '@objc' inference deprecated in Swift 4
(推荐的)原生方式:Swift 4+ 提供了自己的 KVC 模式,其中不需要子类化 NSObject
。
关键路径由前导反斜杠表示,后跟类型和 属性(或属性):
class Student {
var name: String = ""
var gradeLevel: Int = 0
}
let student1 = Student()
student1[keyPath: \Student.name] = "Benny"
我正在使用 Xcode 10.0 和 swift 4.2 从 "Cocoa programming for OSX"
了解键值编码我被要求创建一个简单的 class,它是 NSObject 的子class。以下代码:
import Cocoa
class Student: NSObject {
var name: String = ""
var gradeLevel: Int = 0
}
let student1 = Student()
student1.setValue("Benny", forKeyPath: "name")
student1.setValue("Benny", forKeyPath: "name")
生成以下错误消息:
Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0).
我在网上看了一些关于 KVC 的问题,例如: https://bugs.swift.org/browse/SR-5139
我做错了什么?该书于 2015 年出版。
在 Swift 4 中,出于性能原因不再推断向 Objective-C 运行时公开代码。
为避免崩溃,您必须明确添加 @objc
属性。
@objc var name: String = ""
但是从 Swift 的强类型角度来看,有两种更好的方法可以使用 KVC 获取值:
#keyPath
指令也使用 ObjC 运行时,但在编译时检查关键路径let keyPath = #keyPath(Student.name) student1.setValue("Benny", forKeyPath: keyPath)
在这种情况下,您会收到一个非常具有描述性的编译器警告
Argument of '#keyPath' refers to property 'name' in 'Student' that depends on '@objc' inference deprecated in Swift 4
(推荐的)原生方式:Swift 4+ 提供了自己的 KVC 模式,其中不需要子类化
NSObject
。
关键路径由前导反斜杠表示,后跟类型和 属性(或属性):class Student { var name: String = "" var gradeLevel: Int = 0 } let student1 = Student() student1[keyPath: \Student.name] = "Benny"