Ios 无法实例化函数无法强制转换类型为'__恩萨拉伊';
我在Swift 3中完成了以下功能: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
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类型。越来越干净。