8

在 Xcode 9 Beta 中试用 Swift 4。

出于某种原因,在 NSObject 上使用键值访问器时我遇到了崩溃。

有任何想法吗?

import Cocoa

class Person: NSObject {
    var name = ""
    var age = 0
}

let alpha = Person()
alpha.name = "Robert"
alpha.age = 53

alpha.value(forKey: "name")
// error: Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0).
4

2 回答 2

24

键值编码需要 Objective-C。在 Swift 4 中,您必须明确标记可从 Obj-C 访问的成员:

@objcMembers
class Person: NSObject {

或者

class Person: NSObject {
    @objc var name = ""
    var age = 0
}

Swift Evolution 160

于 2017-06-09T15:34:38.920 回答
7

ObjC 推理在 Swift 4 中受到限制。您可以标记您的类,objcMembers以便编译器生成符合 ObjC 的访问器:

@objcMembers
class Person: NSObject {
    var name = ""
    var age = 0
}

或者通过在 Build Settings中将 Swift 3 Objc Inference设置为 On来恢复旧行为:

在此处输入图像描述

于 2017-06-09T15:37:03.353 回答