如何返回数据类型:Swift 中的 NSDictionary

Posted

技术标签:

【中文标题】如何返回数据类型:Swift 中的 NSDictionary【英文标题】:How to return the data type: NSDictionary in Swift 【发布时间】:2015-01-09 04:18:49 【问题描述】:

我要返回数据类型:NSDictionary。但是主要代码得到了空的 NSDictionary。 我怎么解决这个问题?我在函数中使用了 JSON 方法。

    func regionDataReturn(rid: Int) -> NSDictionary 
    var jsonResult: NSDictionary = NSDictionary()
    let urlPath: String = "MY_SERVER/test.php"
    var url: NSURL = NSURL(string: urlPath)!
    var request1: NSMutableURLRequest = NSMutableURLRequest(URL: url)

    request1.HTTPMethod = "POST"
    var stringPost="test_id=\(tid)" // Key and Value

    let data = stringPost.dataUsingEncoding(NSUTF8StringEncoding)

    request1.timeoutInterval = 60
    request1.HTTPBody=data
    request1.HTTPShouldHandleCookies=false

    let queue:NSOperationQueue = NSOperationQueue()

    NSURLConnection.sendAsynchronousRequest(request1, queue: queue, completionHandler: (response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in

        var err: NSError

        jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary

        self.navigationItem.title = jsonResult["name"] as? String
        NSLog("\(self.navigationItem.title)")
    )

    return jsonResult

【问题讨论】:

【参考方案1】:

你不能那样做。

您正在调用异步函数来获取数据,您的方法将在获取数据之前返回。您有两种方法可以解决此问题:

    使用通知,传递完成处理程序或输出参数将值传递回被调用的方法 使其成为同步调用

var response: AutoreleasingUnsafeMutablePointer<NSURLResponse?> = nil
var error: NSErrorPointer = nil
var data : NSData         =  NSURLConnection.sendSynchronousRequest(request1, returningResponse: response, error:nil)!
var err  : NSError
jsonResult                = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary
self.navigationItem.title = jsonResult["name"] as? String
NSLog("\(self.navigationItem.title)")

【讨论】:

谢谢,我试过了,但打印出了错误。致命错误:在 Swift._fatalErrorMessage (Swift.StaticString, Swift.StaticString, Swift.StaticString, Swift.UInt) -> () () 中展开可选值 #0 0x00000001001d02e0 时意外发现 nil :D 感谢您的回答。我解决了我的问题。我知道异步调用会导致这种情况。 @SunnyJeon:不客气。异步请求不会阻塞你的线程,这是它的主要优点。因此,如果您使用同步请求,您将遇到该问题。所以请记住这一点。 2年前跟教授学过异步调用的概念,现在忘记了。非常感谢:D

以上是关于如何返回数据类型:Swift 中的 NSDictionary的主要内容,如果未能解决你的问题,请参考以下文章

swift3.0怎么获取info.plist文件里的属性值

函数作为swift4中的类型

如何在swift中将'Date'类型的转换值返回为'String'

如何使用 Swift 从一个函数返回不同类型的结构?

swift swift函数返回两种不同的数据类型

Swift中的Void类型与空元祖表达式