Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/96.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 无法实例化函数无法强制转换类型为'__恩萨拉伊';_Ios_Swift_Xcode - Fatal编程技术网

Ios 无法实例化函数无法强制转换类型为'__恩萨拉伊';

Ios 无法实例化函数无法强制转换类型为'__恩萨拉伊';,ios,swift,xcode,Ios,Swift,Xcode,我在Swift 3中完成了以下功能: func parseJSON() { var JsonResult: NSMutableArray = NSMutableArray() do { JsonResult = try JSONSerialization.jsonObject(with: self.data as Data, options:JSONSerialization.ReadingOptions.allowFragments) as! NSMu

我在Swift 3中完成了以下功能:

    func parseJSON() {
    var JsonResult: NSMutableArray = NSMutableArray()

    do {
        JsonResult = try JSONSerialization.jsonObject(with: self.data as Data, options:JSONSerialization.ReadingOptions.allowFragments) as! NSMutableArray
    } catch let error as NSError {
        print(error)
    }
    var jsonElement:NSDictionary=NSDictionary()
    let locations: NSMutableArray = NSMutableArray()

    for i in 0 ..< JsonResult.count
    {
        jsonElement = JsonResult[i] as! NSDictionary
        let location = Parsexml()

        if let title = jsonElement["Title"] as? String,
            let body = jsonElement["Body"] as? String,
            let userId = jsonElement["UserId"] as? Int,
            let Id = jsonElement["Id"] as? Int
        {

            location.title = title
            location.body = body
            location.userId = userId
            location.id = Id

        }

        locations.add(location)
    }
    DispatchQueue.main.async { () -> Void in

        self.delegate.itemsDownloaded(items: locations)

    }
带着信号灯离开的地方


我错过了什么

您正试图将NSArray转换为NSMutable数组,这正是警告所抱怨的

获取它提供给您的数组,然后将其转换为可变数组

let jsonArray = try JSONSerialization.jsonObject(with: self.data as Data, options:JSONSerialization.ReadingOptions.allowFragments) as! NSArray
jsonResult = jsonArray.mutableCopy() as! NSMutableArray

不相关,但您可能还希望为JsonResult使用小写值,以符合正常的iOS风格准则。它应该是jsonResult。

您试图将NSArray转换为NSMutable数组,这正是警告所抱怨的

获取它提供给您的数组,然后将其转换为可变数组

let jsonArray = try JSONSerialization.jsonObject(with: self.data as Data, options:JSONSerialization.ReadingOptions.allowFragments) as! NSArray
jsonResult = jsonArray.mutableCopy() as! NSMutableArray

不相关,但您可能还希望为JsonResult使用小写值,以符合正常的iOS风格准则。它应该是jsonResult。

另一种改进代码的方法:

您没有对
JsonResult
进行变异,因此无需将其声明为
NSMutableArray

    var JsonResult = NSArray()

    do {
        JsonResult = try JSONSerialization.jsonObject(with: self.data as Data, options:JSONSerialization.ReadingOptions.allowFragments) as! NSArray
    } catch let error as NSError {
        print(error)
    }

还有一些改进代码的步骤

enum MyError: Error {
    case NotArrayOfDict
}
func parseJSON() {
    do {
        guard let jsonResult = try JSONSerialization.jsonObject(with: self.data as Data) as? [[String: Any]] else {
            throw MyError.NotArrayOfDict
        }
        let locations: NSMutableArray = NSMutableArray()

        for jsonElement in jsonResult {
            let location = Parsexml()

            if let title = jsonElement["Title"] as? String,
                let body = jsonElement["Body"] as? String,
                let userId = jsonElement["UserId"] as? Int,
                let Id = jsonElement["Id"] as? Int
            {
                location.title = title
                location.body = body
                location.userId = userId
                location.id = Id

            }

            locations.add(location)
        }
        DispatchQueue.main.async { () -> Void in
            self.delegate.itemsDownloaded(items: locations)
        }
    } catch let error {
        print(error)
    }
}
  • as强制转换有时会使你的应用程序崩溃,只有当你100%确信结果已安全转换为类型时才使用它。如果不是,则将guard let与
    as一起使用更安全

  • 尽可能使用Swift类型,而不是
    NSSomething

  • 不需要指定
    .allowFragments
    ,因为您希望结果是数组


如果您可以修改代码的其他部分,您可以将代码编写为:

func parseJSON() {
    do {
        //If `self.data` was declared as `Data`, you would have no need to use `as Data`.
        guard let jsonResult = try JSONSerialization.jsonObject(with: self.data) as? [[String: Any]] else {
            throw MyError.NotArrayOfDict
        }
        var locations: [Parsexml] = [] //<-Use Swift Array

        for jsonElement in jsonResult {
            let location = Parsexml()

            if let title = jsonElement["Title"] as? String,
                let body = jsonElement["Body"] as? String,
                let userId = jsonElement["UserId"] as? Int,
                let Id = jsonElement["Id"] as? Int
            {

                location.title = title
                location.body = body
                location.userId = userId
                location.id = Id

            }

            locations.append(location)
        }
        DispatchQueue.main.async { () -> Void in
            self.delegate.itemsDownloaded(items: locations)
        }
    } catch let error {
        print(error)
    }
}
func parseJSON(){
做{
//如果将'self.data'声明为'data',则无需使用'as data'。
guard let jsonResult=将JSONSerialization.jsonObject(with:self.data)作为?[[String:Any]]其他内容尝试{
扔掉我的错误
}
变量位置:[Parsexml]=[]//在中无效
self.delegate.itemsDownloaded(项目:位置)
}
}捕捉错误{
打印(错误)
}
}

另一种改进代码的方法:

您没有对
JsonResult
进行变异,因此无需将其声明为
NSMutableArray

    var JsonResult = NSArray()

    do {
        JsonResult = try JSONSerialization.jsonObject(with: self.data as Data, options:JSONSerialization.ReadingOptions.allowFragments) as! NSArray
    } catch let error as NSError {
        print(error)
    }

还有一些改进代码的步骤

enum MyError: Error {
    case NotArrayOfDict
}
func parseJSON() {
    do {
        guard let jsonResult = try JSONSerialization.jsonObject(with: self.data as Data) as? [[String: Any]] else {
            throw MyError.NotArrayOfDict
        }
        let locations: NSMutableArray = NSMutableArray()

        for jsonElement in jsonResult {
            let location = Parsexml()

            if let title = jsonElement["Title"] as? String,
                let body = jsonElement["Body"] as? String,
                let userId = jsonElement["UserId"] as? Int,
                let Id = jsonElement["Id"] as? Int
            {
                location.title = title
                location.body = body
                location.userId = userId
                location.id = Id

            }

            locations.add(location)
        }
        DispatchQueue.main.async { () -> Void in
            self.delegate.itemsDownloaded(items: locations)
        }
    } catch let error {
        print(error)
    }
}
  • as强制转换有时会使你的应用程序崩溃,只有当你100%确信结果已安全转换为类型时才使用它。如果不是,则将guard let与
    as一起使用更安全

  • 尽可能使用Swift类型,而不是
    NSSomething

  • 不需要指定
    .allowFragments
    ,因为您希望结果是数组


如果您可以修改代码的其他部分,您可以将代码编写为:

func parseJSON() {
    do {
        //If `self.data` was declared as `Data`, you would have no need to use `as Data`.
        guard let jsonResult = try JSONSerialization.jsonObject(with: self.data) as? [[String: Any]] else {
            throw MyError.NotArrayOfDict
        }
        var locations: [Parsexml] = [] //<-Use Swift Array

        for jsonElement in jsonResult {
            let location = Parsexml()

            if let title = jsonElement["Title"] as? String,
                let body = jsonElement["Body"] as? String,
                let userId = jsonElement["UserId"] as? Int,
                let Id = jsonElement["Id"] as? Int
            {

                location.title = title
                location.body = body
                location.userId = userId
                location.id = Id

            }

            locations.append(location)
        }
        DispatchQueue.main.async { () -> Void in
            self.delegate.itemsDownloaded(items: locations)
        }
    } catch let error {
        print(error)
    }
}
func parseJSON(){
做{
//如果将'self.data'声明为'data',则无需使用'as data'。
guard let jsonResult=将JSONSerialization.jsonObject(with:self.data)作为?[[String:Any]]其他内容尝试{
扔掉我的错误
}
变量位置:[Parsexml]=[]//在中无效
self.delegate.itemsDownloaded(项目:位置)
}
}捕捉错误{
打印(错误)
}
}


因为强制转换不会转换
JSONSerialization.jsonObject(…)
NSArray
对象,而不是
NSMutableArray
对象。如果您想要一个可变数组,请将其设置为
NSArray
,然后您可以从
NSArray
创建一个
NSMutableArray
,并将其分配给
JsonResult
我不确定我是否真的遵守了。那看起来怎么样?你可以把它作为答案贴出来,这样我可以检查一下吗?更好的问题是你为什么要使用
NSArray
NSMutableArray
NSDictionary
?您正在编写Swift代码,请使用Swift数据类型。因为强制转换不会转换
JSONSerialization.jsonObject(…)
NSArray
对象,而不是
NSMutableArray
对象。如果您想要一个可变数组,请将其设置为
NSArray
,然后您可以从
NSArray
创建一个
NSMutableArray
,并将其分配给
JsonResult
我不确定我是否真的遵守了。那看起来怎么样?你可以把它作为答案贴出来,这样我可以检查一下吗?更好的问题是你为什么要使用
NSArray
NSMutableArray
NSDictionary
?您正在编写Swift代码,请使用Swift数据类型。您还可以将可变叶选项传递给
jsonObject()
。同意,但OP的评论听起来很混乱,因此我想在这一点上澄清一下,因此另写一行。非常感谢先生!是的,我有点困惑。:-)仍然在这个基础上。来自网络编程-但你解释得很好!您也可以将可变叶选项传递给
jsonObject()
。同意,但OP的评论听起来很混乱,因此我想在这一点上澄清一下,因此单独一行。非常感谢您,先生!是的,我有点困惑。:-)仍然在这个基础上。来自网络编程-但你解释得很好!这样好多了。使用Swift类型。越来越干净,这好多了。使用Swift类型。越来越干净。