2017-06-09 15 views
3

Xcode 9 BetaでSwift 4を試してみました。NSObjectの値(forKey :)が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). 
+0

関連:[私はスウィフト4で#selector()と@objc推論廃止に対処するにはどうすればよいです?](https://stackoverflow.com/q/44390378/2976878) – Hamish

+0

文字列の代わりに '#keyPath(Person.name)'を使用して 'value(forKey:)'を呼び出すと、コンパイラは適切なエラーを表示しますメッセージとFix-it! –

+0

また、Swift 4に入っていても、Swiftのキー値コーディングメカニズム 'print(alpha [keyPath:\ Person.name])' :)を使用しています。そして、 'NSObject'から継承する必要はありません。 'Person'を' struct'にすることさえできます。 – Hamish

答えて

7

キー値コーディングにはObjective-Cが必要です。

@objcMembers 
class Person: NSObject { 

または

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

Swift Evolution 160

+0

ありがとうございました! – closetCoder

4

にObjCの推論は、あなたのクラスをマークできスウィフト4にlimitedされている参照してください:スウィフト4で明示的にObjCからアクセスできるメンバーをマークする必要がありコンパイラがObjC準拠アクセサを生成するためのobjcMembersを使用します。

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

またはビルドの設定をオンにスウィフト3にObjC推論を設定することで、以前の動作を取り戻す:

enter image description here

+0

"Swift 3 @objc Inference"ビルドの設定は、実際に移行を支援するためだけに存在するため、永続的な解決策ではありません。 – Hamish

関連する問題