2017-10-21 8 views
0

는 :자 NSPredicate NSUnknownKeyException은 - 스위프트 아래에 나열된 내 현재 코드가 4.0

개체 유형 '[<ViewController.User 0x6000000afa20> valueForUndefinedKey:]':

위의 코드가 발생
class ViewController:UIViewController{ 

ovveride func viewDidLoad(){ 
filterData() 
} 

func filterData(){ 
    var usersArray = [User(name:"John",userId:1),User(name:"Ed",userId:2),User(name:"Ron",userId:3)] 

let filteredData = (userArray as NSArray).filtered(using:NSPredicate(format: "userId=1")) 
} 
} 

는 다음의 예외 (NSUnknownKeyException)를 던졌습니다 이 클래스는 키 userId에 대해 키 코드를 준수하지 않습니다.

filter(using:)에 대한 Apple의 문서에는이 문제를 일으킬 수있는 변경이 명시되어 있지 않습니다.

스위프트 4.0에서 NSPredicate을 어떻게 사용할 수 있습니까?

요청에 따라 @objc을 사용해 보았습니다. 그러나 여전히 같은 오류입니다. 또한 댓글로

@objc 
class User:NSObject{ 
var name:String! 
var userId:Int! 

init(name:String,userId:Int){ 
self.name = name 
self.userId = userId 
} 
} 

내가 아래 메시지가 나타납니다 userId에 @objc 속성을 추가에,이 질문에 대한 받았다. 그 유형이 자 NSPredicate 오브젝티브 C에

@objc 
class User:NSObject{ 
@objc var name:String! 
var userId:Int! //@objc here results in error 

init(name:String,userId:Int){ 
self.name = name 
self.userId = userId 
} 
} 

문자열 속성을 표현 완전히 잘 작동 할 수 없기 때문에 속성은 @objc 표시 할 수 없습니다. - @objc를 클래스 에 추가 - 또한 속성에 @objc를 추가하십시오.

+3

https://stackoverflow.com/questions/44390378/how-can-i-deal-with-objc-inference-deprecation-with-selector-in-swift-4의 가능한 중복 - 추가했다 '@ objc'를 사용하여'userId' 속성을 Objective-C에 노출 시키시겠습니까? –

+1

관련이 없지만 속성을 명시 적으로 비 선택적 값으로 초기화하더라도 암시 적으로 래핑 된 옵션으로 속성을 선언하는 이유는 무엇입니까? 그러지 마. 느낌표를 제거하십시오. 예, 컴파일러 오류가 발생하지 않습니다. 클래스 앞의'@ objc'는 멤버에 영향을주지 않습니다. 필요한 각 멤버 앞에'@ objcMembers'를 사용하거나'@ objc'를 추가하십시오. 그럼에도 불구하고 NSPredicate를 사용할 이유가 없습니다. – vadian

+1

'@ ojbc'를'userID' 속성 자체에 추가하려고 했습니까? Swift 4.0은 이전 버전보다'@objc' 동작에 대해 좀 더 까다 롭습니다. –

답변

3

filter을 사용하지 않으시겠습니까? 그것은 훨씬 더 "Swift-y"이고 어레이를 NSArray으로 변환하는 것을 포함하지 않습니다.

let filteredData = usersArray.filter { $0.userId == 1 } 
+0

NSPredicate 대 당신이 언급 한 필터 인 {}을 사용하려고합니다. NSPredicate와 함께 작동하지 않는 이유를 모르겠다 - 컴파일 타임 오류가 없습니까? – andyPaul

+0

'NSPredicate'를 사용하고자하는 특별한 이유가 있습니까? [Martin R] (https://stackoverflow.com/users/1187415/martin-r)은 주석에이 문제에 대한 가능한 해결책을 이미 작성했습니다. – the4kman