Я пишу тестовую программу с Core Data, используя Swift 3.0 в Xcode 8. Проблема в том, что когда я пытаюсь получить какие-либо данные из NSManagedObject следующим образом:
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 {
отмечен с ошибкой
Значение типа Any не имеет члена valueForKey.
Итак, вопрос в том, как получить из типа Any данные одной записи? P.S. если это возможно, без приведения к типу AnyObject, потому что это приводит к этому
if let a = (i as AnyObject).value("b") as? String {
который также имеет ошибку:
Не удается вызвать «значение» со списком аргументов типа «(String)»
И я хочу сделать это должным образом. Благодарю вас!
ОБНОВИТЬ
Я нашел решение (спасибо 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 {
}
Я все еще ищу правильный способ сделать это.
fetch
возвращает[Any]
. Вы должны понизить тип до[NSManagedObject]
или[NSFetchRequestResult]
или, если вы используете подклассNSManagedObject
, что рекомендуется, до[<Name Of Subclass>]
- person vadian   schedule 15.09.2016as! [NSManagedObject]
к строкеfetch
. Необязательная привязкаif let a = i
не нужна, поскольку в этом случае гарантируется, что возвращаемый тип —NSManagedObject
. - person vadian   schedule 15.09.2016fetch
может возвращать массивDictionary
или массивNSManagedObject
в зависимости от запроса. Если вы не передадите явноreturn value is dictionary
, вы получите 100%NSManagedObject
. Это один из немногих случаев, когда необязательная привязка используется неправильно, потому что она избыточна. - person vadian   schedule 15.09.2016