2014-08-30 28 views
0

發生了一些奇怪的事情。swift ios:類似數據的不同錯誤..很奇怪

我有這個在我的TableDataArray:

(
    { 
     count = 0; 
     title = Open; 
    }, 
     { 
     count = 20; 
     title = Closed; 
    }, 
     { 
     count = 0; 
     title = Pending; 
    }, 
     { 
     count = 10; 
     title = Queue; 
    } 
) 

當我這樣做只是:

var rowData: NSDictionary = TableDataArray[indexPath.row] as NSDictionary 

var maintext: String? = rowData["title"] as NSString 
println(maintext) 

if (maintext != nil){ 
    cell.textLabel.text = maintext 
} 

它的作品,我看到標題我的表。

但只要我添加這些行:

var detailtext: String? = rowData["count"] as NSString ## tried also as Int, NSInteger, similar fate 

println(detailtext) 

if (detailtext != nil) { 
    cell.detailTextLabel.text = detailtext 
} 

的應用程序崩潰與「斯威夫特動態轉換失敗」,我無法找出原因。

另一種情況是,如果我進行另一個API調用,並且結果相似,但不會崩潰,它只會顯示...... text和detailtext。

然而,在另一API調用,它崩潰,但與「致命錯誤:意外發現零而展開的可選值」在一個又一個......然而,它只是說字符串不是轉換爲UINT8 ..

而這正在擾亂我。相同的API調用,相似的結果,但它工作於一體,並與不同的結果崩潰...

所以問題是,我該如何檢測和解決這些問題,然後顯示detailText ......因爲值那裏。

謝謝。

+0

是否保存NSNumber的rowData [「count」]? – 2014-08-30 10:11:01

+0

如何聲明你的TableDataArray。 – Amit 2014-08-30 10:16:32

回答

1

您的值不能是IntString,因爲NSDictionary中的值必須是對象。您的countNSNumber,它是基本數字類型的對象封裝。

if let count = rowData["count"] as? NSNumber { 
    // If I get here, I know count is an NSNumber. If it were some other type 
    // it wouldn't crash, but I wouldn't get to this point. 

    cell.detailTextLabel.text = "\(count)" 
} 

這保護你從問題一大堆:

安全地從您的NSDictionary使用這種風格的提取數量。當您詢問NSDictionary中的項目時,詞典中可能不存在該鍵,在這種情況下,結果將爲nil。如果您試圖直接將其轉換爲預期類型,您將得到致命錯誤:意外地發現零,同時解包可選值消息。有了上述風格,nil處理得當,沒有錯誤結果,你只是不輸入塊。

看來你的count可以有各種類型。您可以使用switch更清潔的方式來處理這個問題:

switch rowData["count"] { 
case let count as NSNumber: 
    cell.detailTextLabel.text = "\(count)" 
case let count as NSString: 
    cell.detailTextLabel.text = count 
case nil: 
    println("value not in dictionary") 
default: 
    println("I still haven't identified the type") 
} 
+0

嗨vacawama,謝謝你的答案,我知道我對NSDictionary的理解是錯誤的。我將它視爲純文本多維數組。現在我的應用程序沒有崩潰,但現在,它只列出了零而不是20和10的值。 – admin0 2014-08-30 11:39:34

0

這工作:

if let maintext = rowData["title"] as? NSString { 
     println(maintext) 
     cell.textLabel.text = maintext 

    } 

    if var count = rowData["count"] as? NSNumber { 
     // If I get here, I know count is an NSNumber. If it were some other type 
     // it wouldn't crash, but I wouldn't get to this point. 
     println("\(count)") 
     cell.detailTextLabel.text = "\(count)" 


    } 

    if var count = rowData["count"] as? String { 
     // If I get here, I know count is an NSNumber. If it were some other type 
     // it wouldn't crash, but I wouldn't get to this point. 
     println(count) 
     cell.detailTextLabel.text = count 


    } 

但是,這是正確的做法?