从 AnyObject 访问值时生成异常

Posted

技术标签:

【中文标题】从 AnyObject 访问值时生成异常【英文标题】:Exception generated while accessing value from AnyObject 【发布时间】:2016-10-14 11:37:16 【问题描述】:

产生这种错误

[_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 中运行良好

【问题讨论】:

object 的值应该是多少?它应该是字典还是数组?我把“object = your code”放在操场上,它打印为“Optional((Function))”。 @zionperez 是上面的字典 您能就我的回答给我一些反馈吗?谢谢 【参考方案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

    

【讨论】:

我完全明白你所说的并且它是正确的,但是我的代码是这样的,我需要使用 AnyObject 否则我需要在所有地方进行更改,这可能是 1000 个更改。 @ParthAdroja 如果您不想使用下标,请使用 object(forKey:) 和字典。【参考方案2】:

您说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

【讨论】:

以上是关于从 AnyObject 访问值时生成异常的主要内容,如果未能解决你的问题,请参考以下文章

如何快速过滤json对象?

SWIFT - 致命错误:在展开可选值时意外发现 nil

Swift 4 - 如何使用缓存加载图像?

未处理的异常:错误状态:尝试从 Hive 获取值时没有元素

循环通过 [AnyObject]?导致没有名为生成器的成员

SwiftyJSON.JSON 到 [String: AnyObject]