从AnyObject访问值时生成异常

时间:2016-10-14 11:37:17

标签: 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中运行良好

2 个答案:

答案 0 :(得分:1)

错误表示您的object类型为_SwiftValue且您无法使用它访问Objective C方法,以解决您的问题,将object转换为[String: Any]并使用subscript代替object(forKey:)

if let obvj = object as? [String: Any] {
    if let ct = obvj["currenttime"] as? Date

    }
}

答案 1 :(得分:0)

您声明object变量是字典类型。我可能是错的,但我相信你的字典对象的语法是不正确的。字典应采用以下格式:[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是如何运作的。它对我不起作用。也许您在代码中添加了Date的扩展名?在我上面的代码中,我使用了标准库中的DateFormatter,稍微修改了日期字符串以符合预期的格式。我按照开发人员参考中的示例进行了操作"使用固定格式日期表示"在这里找到:

https://developer.apple.com/reference/foundation/dateformatter