#ios #swift #swift3 #xcode8 #anyobject
#iOS #swift #swift3 #xcode8 #anyobject
Вопрос:
Генерируется ошибка такого рода
[_SwiftValue objectForKey:]: нераспознанный селектор, отправленный экземпляру 0x600000a805a0
Когда я запускаю приведенный ниже код
let obvj = object as AnyObject
print(obvj)
let ct = obvj.object(forKey: "currenttime") as! Date
Здесь значение объекта равно
Optional({
currenttime = "2016-10-14 11:30:12 0000";
endtime = "2016-10-14 14:30:12 0000";
success = 1;
})
Хотя в Swift 2.2 это работало нормально
Комментарии:
1. Каким должно быть значение объекта? Предполагается, что это словарь или массив? Я помещаю «объект = ваш код» на игровую площадку, и он печатается как «Необязательный ((Функция))».
2. @zionperez Это словарь, как указано выше
3. Не могли бы вы дать мне несколько отзывов о моем ответе? Спасибо
Ответ №1:
Ошибка говорит о том, что ваш object
тип является типом _SwiftValue
, и вы не можете получить доступ к методу Objective C с его помощью, чтобы решить вашу проблему, используйте object
as [String: Any]
и используйте subscript
вместо object(forKey:)
.
if let obvj = object as? [String: Any] {
if let ct = obvj["currenttime"] as? Date
}
}
Комментарии:
1. Я полностью понимаю, что вы сказали, и это правильно, но мой код таков, что мне нужно использовать AnyObject, иначе мне нужно изменить во всех местах, где может быть 1000 изменений.
2. @ParthAdroja Если вы не хотите использовать нижний индекс, используйте
object(forKey:)
со словарем.
Ответ №2:
Вы указали, что object
переменная является типом словаря. Я могу ошибаться, но я считаю, что ваш синтаксис для объекта dictionary неверен. Словарь должен иметь формат: [key 1: value 1, key 2: value 2, key 3: value 3]
.
Вот код, который я успешно запустил на игровой площадке:
//: Playground
import Foundation
let object = Optional([
"currenttime" : "2016-10-14T11:30:12 00:00",
"endtime" : "2016-10-14T14:30:12 00:00",
"success" : 1
])
let obvj = object as AnyObject?
print(obvj) // prints the dictionary object
let ct = obvj!.object(forKey: "currenttime") as! String
print(ct) // prints: 2016-10-14T11:30:12 00:00
// https://developer.apple.com/reference/foundation/dateformatter
let dateFormatter = DateFormatter()
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZZ"
dateFormatter.timeZone = TimeZone(secondsFromGMT: 0)
let date = dateFormatter.date(from: ct)
print(date?.description) // prints: Optional("2016-10-14 11:30:12 0000")
object
Var инициализируется как необязательный тип словаря.
Строка, которая у вас здесь: let obvj = object as AnyObject
должна быть let obvj = object as AnyObject?
. object
должно быть приведено как необязательный AnyObject, поскольку оно начиналось как необязательный тип словаря.
Я не уверен, как у вас string as Date
работает. У меня это не сработало. Возможно, вы добавили расширение в свой код? В моем коде выше я использовал DateFormatter из стандартной библиотеки и немного изменил строку даты, чтобы соответствовать ожидаемому формату. Я следовал примеру из ссылки разработчика «Работа с представлениями даты в фиксированном формате», найденной здесь:
https://developer.apple.com/reference/foundation/dateformatter