Словарь типа [NSObject: AnyObject] не имеет члена "значение (forKeyPath: ...)"
Я конвертирую приложение в swift3 и сталкиваюсь со следующей проблемой.
@objc required init(response: HTTPURLResponse, representation: [NSObject : AnyObject])
{
if (representation.value(forKeyPath: "title") is String) {
self.title = **representation.value**(forKeyPath: "title") as! String
}
Я получаю следующую ошибку:
Значение типа [NSObject:AnyObject] не имеет значения члена.
В старой версии кода я просто использовал AnyObject в качестве типа для представления, но если я это сделаю, я получаю ошибку AnyObject is not a subtype of NSObject
там:
if (representation.value(forKeyPath: "foo") is String) {
let elementObj = Element(response: response, representation:**representation.value(forKeyPath: "foo")**!)
}
1 ответ
Вы смешиваете стили Objective-C и Swift. Лучше на самом деле решить.
Возвращаясь к NSDictionary
не является автоматическим
Рассматривать:
let y: [NSObject: AnyObject] = ["foo" as NSString: 3 as AnyObject] // this is awkward, mixing Swift Dictionary with explicit types yet using an Obj-C type inside
let z: NSDictionary = ["foo": 3]
(y as NSDictionary).value(forKeyPath: "foo") // 3
// y["foo"] // error, y's keys are explicitly typed as NSObject; reverse bridging String -> NSObject/NSString is not automatic
y["foo" as NSString] // 3
y["foo" as NSString] is Int // true
z["foo"] // Bridging here is automatic though because NSDictionary is untyped leaving compiler freedom to adapt your values
z["foo"] is Int // true
// y.value // error, not defined
// Easiest of all:
let ynot = ["foo": 3]
ynot["foo"] // Introductory swift, no casting needed
ynot["foo"] is Int // Error, type is known at compile time
Ссылка:
Обратите внимание на явное использование 'as'
требуется, чтобы получить String
вернуться к NSString
, Мост не скрыт, потому что они хотят, чтобы вы использовали типы значений (String
) по ссылочным типам (NSString
). Так что это намеренно более громоздко.
Одним из основных преимуществ типов значений по сравнению со ссылочными типами является то, что они облегчают анализ вашего кода. Для получения дополнительной информации о типах значений см. Классы и структуры на языке программирования Swift (Swift 3) и сеанс WWDC 2015 414 "Создание лучших приложений с типами значений в Swift".