Исключение, созданное при доступе к значению из AnyObject

#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