如何从 Swift 中的 error.userInfo 获取 ["error"]["type"]?

Posted

技术标签:

【中文标题】如何从 Swift 中的 error.userInfo 获取 ["error"]["type"]?【英文标题】:How to get ["error"]["type"] from error.userInfo in Swift? 【发布时间】:2015-07-19 09:34:42 【问题描述】:

我想知道我们如何在 Swift 中做到这一点?

我正在尝试将下面的代码转换为 Swift

FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphpath:@"me" parameters:nil];
    [request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) 
        if (!error) 
            // handle successful response
         else if ([[error userInfo][@"error"][@"type"] isEqualToString: @"OAuthException"])  // Since the request failed, we can 
            NSLog(@"The facebook session error");
         else 
            NSLog(@"Some other error: %@", error);
        
    ];

这是我所做的。

request.startWithCompletionHandler  (connection: FBSDKGraphRequestConnection!, result: AnyObject!, error: NSError!) -> Void in
        if error == nil 
            // handle successful response
        
        else if error.userInfo["error"]["type"] == "OAuthException"  
           //THIS LINE WONT COMPILE

        
        else 
            println("Some other error");
        
    

但我收到一个编译错误,在此行显示 could not find member 'subscript'

error.userInfo["error"]["type"] == "OAuthException" 

有什么想法吗?

【问题讨论】:

能否告诉我们您使用的是哪个 XCode 版本? 你需要像error.(userInfo as [String] [String])[...]一样投你的userinfo 【参考方案1】:

试试:

if (error.userInfo?["error"]?["type"] as? String) == "OAuthException" 

userInfo[NSObject: AnyObject]? 类型的可选字典,因此您需要打开它。字典查找总是返回一个可选的(因为键可能不存在),因此您必须在访问嵌套字典的键之前对其进行解包。使用? 而不是!可选链接,如果"error" 键不存在,它会无害地导致nil(如果您使用! 而不是崩溃)。最后,您需要将结果转换为 String(来自 AnyObject),以便能够将其与 "OAuthException" 进行比较。

【讨论】:

这不起作用,仍然是相同的错误消息。不过谢谢 我刚刚查了一下。 userInfo[NSObject: AnyObject]? 类型,所以你也需要打开它。我已经更新了我的答案。 我可以知道你在哪里看的吗? option-click 是你的朋友。我在 Playground 中输入了let u = NSError().userInfo ,然后单击了userInfo,弹出窗口告诉了类型。 我不确定它何时更改,但 NSError.userInfo 不再是可选的。【参考方案2】:

如何分解错误和类型如下所示?

           else if let errorOAuthException: AnyObject =  error.userInfo as? Dictionary<String, AnyObject>

            if errorOAuthException["error"] != nil 
                if errorOAuthException["type"] as? String == "OAuthException" 

                //Do something for me
                
            


        

【讨论】:

以上是关于如何从 Swift 中的 error.userInfo 获取 ["error"]["type"]?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 iOS 中的流中接收数据(swift)

如何从 Swift 中的主线程中关闭

如何从 Swift 4 中的描述中解析数组?

如何从 Swift 3 中的数据中读取属性列表

如何从目标 c 中的 pod 文件访问我的 swift 项目文件?

如何从 Swift 中的 NSURLResponse 中检索 cookie?