2016-09-17 194 views
0

我试图填补我的阵列,在JSONArray金银币,我从服务器获取和我做了这个代码(SWIFT 3 Xcode中8)的值:无法投型“_SwiftValue”错误

func parseReservationJson(_ anyObject:Array<AnyObject>){ 
      nodes.removeAll() 
      reservations.removeAll() 
      for anyObj in anyObject{ 
       let client_name = (anyObj["client_name"] as? String) ?? "" 
       let client_family = (anyObj["client_family"] as? String) ?? "" 
       let ft_of_time = ((anyObj["ft_of_time"] as AnyObject as! NSString).substring(to: 5) as NSString) 
      } 
    } 

但我发现了这个错误for声明的最后一行:

Could not cast value of type '_SwiftValue' (0x112d8a898) to 'NSString' (0x11003eab8). 

我不想使用依赖转换JSON。哪里不对?

+0

什么是_SwiftValue?你将把'anyObj [“ft_of_time”]'的结果转换为'NSString',编译器说你不能。并使用本地的Swift'substringTo'。我知道获得适当的指数更加困难,但它更可靠。 – vadian

+0

我不会问我是否知道答案!我不知道为什么我会把'AnyObject'转换成'NSString'的错误@vadian –

+0

好,下一个问题:anyObj [“ft_of_time”]'的结果的实际类型是什么? – vadian

回答

1

的错误原因斯威夫特3 AnyObject?不能被铸造直接基金会NSString

你可以写

let ft_of_time = ((anyObj["ft_of_time"] as! String as NSString).substring(to: 5) as NSString) 

但我建议用

let ftOfTime = anyObj["ft_of_time"] as! String 
let ft_of_time = ftOfTime.substring(to:ftOfTime.index(ftOfTime.startIndex, offsetBy: 5)) as NSString 

它做了同样的更换整条生产线,但它使用原生API斯威夫特。除了最终演员阵容为NSString(如果需要的话),没有类型来回转换。

+0

代码与swift 2工作,但在转换为swift 3后,它停止工作 –

+0

'NSString'是基础,但'字符串'不是?那么'String'是什么? – Honey

+0

'String'是一个本地Swift类型,它是一个具有值类型语义的结构(与Foundation的'NSString'不同,它是引用类型)。它与'NSString'非常相似,但有几个不同的功能。为了兼容性,可以很容易地将'String'桥接到'NSString'。 – vadian

0

您可以转换StringNSString

let swiftString:String = "Swift style string" 
let objCString:NSString = NSString(string:swiftString) 

所以先投你stringnsstring正确,那么你可以使用nsstring

2

methods坏点所在的位置:

anyObj["ft_of_time"] as AnyObject 

(请检查this。)

如果确定anyObj["ft_of_time"]NSString型的,只需使用as!,否则你应该使用可选的结合:

if let rawFt_of_time = anyObj["ft_of_time"] as? NSString { 
    let ft_of_time = Utils.convert_string(string: rawFt_of_time.substring(to: 5) as NSString) 
    //Use ft_of_time here... 
} 

不要使用as AnyObject沉默编译器...

相关问题