2016-09-17 98 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沉默編譯器...

相關問題