2016-09-15 2 views
1

Xcode 8에서 Swift 3.0을 사용하여 테스트 프로그램을 작성하고 있습니다. 문제는 NSManagedObject에서 다음과 같이 데이터를 받으려고 할 때입니다.Swift 3 'Any'에 'valueForKey'멤버가 없습니다.

let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Entity") 
request.returnsObjectsAsFaults = false 
do { 
    let entityTableInCoreData = try newPrivateQueueContext.fetch(request) 
    for i in entityTableInCoreData { 
     if let a = i.valueForKey("b") as? String { 
      print(a) 
     } 
    } 
} catch { 
} 

라인은

if let a = i.valueForKey("b") as? String { 

Value of type 'Any' has no member 'valueForKey'

그래서 질문에서 얻을하는 방법은 오류 표시 type 단일 레코드 데이터? 오후 8시 30 분 P.S. 이 AnyObject 유형으로 변환하지 않고, 가능하다면 그것은 또한 오류가이

if let a = (i as AnyObject).value("b") as? String { 

을 선도하고 있기 때문에 :

Cannot invoke 'value' with an argument list of type '(String)'

그리고 적절한 방법으로 그것을하고 싶어. 감사합니다.

UPDATE가 나는 해결책 (Vadian 덕분에) 발견,하지만 난 그게 바로 하나입니다 의심 : 나는 아직도이 할 수있는 올바른 방법을 찾고 있어요

do { 
    let entityTableInCoreData = try newPrivateQueueContext.fetch(request) 
    for i in entityTableInCoreData { 
     print("Record") 
     //print(i) 
     if let a = i as? NSManagedObject { 
      print("a: \(a.value(forKey: "a"))") 
     } 
    } 

} catch { 
} 

.

+0

아니요, 오류입니다. – Alex

+0

'Any'에는 아래 첨자가 없습니다. – Alex

+0

어떻게해야합니까? fetch (request) as [String : AnyObject] – Alex

답변

3

fetch[Any]을 반환합니다. 유형을 실제 유형 (이 경우 [NSManagedObject])으로 다운 캐스트해야합니다.

let entityTableInCoreData = try newPrivateQueueContext.fetch(request) as! [NSManagedObject] 

에 따라 때문에 강제로 내리 뜬 안전이다가 반환 형식이 NSManagedObject 것을 보장의 요청에 가져옵니다.