填充单元格时无法解包可选

时间:2016-05-09 19:24:39

标签: ios swift

我讨厌发布这个,因为它看起来像是基本的Swift,但是,我找不到一种方法让这个可选的unwrapped,我知道它可能与NSUserDefaults存储它的方式,但我是不确定。

我正在保存[String]:

NSUserDefaults.standardUserDefaults().setObject(infectedNamesArray, forKey: "infectedNamesArray")

并回忆起这样:

if let infected = NSUserDefaults.standardUserDefaults().objectForKey("infectedNamesArray")
    {
        infectedNamesArray = infected as! [String]
    }

我正在使用数组填充这样的可重用单元格:

switch whichScoreSet
    {
    case 0:
        cell.nameLabel.text = "Test"
        cell.scoreLabel.text = "Test"
    case 1:
        cell.nameLabel.text = infectedNamesArray[indexPath.row]
        cell.scoreLabel.text = "\(infectedGameScoreTotals["\(infectedNamesArray[indexPath.row])"]!)"
    case 2:
        cell.nameLabel.text = "Test"
        cell.scoreLabel.text = "Test"
    default:
        print("Something Went Wrong")
    }

一切正常,我可以在表数据和加载视图之间切换。从cell.nameLabel.text查看数据时,它始终显示可选。即optional(valueFromArray)

我试图强制打开它,Xcode告诉我我不能打开一个字符串。我已经尝试将它作为一个字符串进行投射,Xcode告诉我它没有任何区别,因为它已经是一个字符串了。

我对这个基本的Swift感到茫然,所以请原谅这个问题。许多其他SO帖子的技术提供了相同的结果。

我在这里俯瞰什么?

EDITED

变量在类之外声明。

var infectedNamesArray = [String]()

3 个答案:

答案 0 :(得分:1)

试试这个

switch whichScoreSet
    {
    case 0:
        cell.nameLabel.text = "Test"
        cell.scoreLabel.text = "Test"
    case 1:
    if let nameString = infectedNamesArray[indexPath.row] as? String  {
        cell.nameLabel.text = nameString
        cell.scoreLabel.text = "\(infectedGameScoreTotals["\(nameString)"]!)"
   }
    case 2:
        cell.nameLabel.text = "Test"
        cell.scoreLabel.text = "Test"
    default:
        print("Something Went Wrong")
    }

答案 1 :(得分:1)

infectedNamesArray[indexPath.row]应该是安全的,所以你可以直接使用它

let infectedName = infectedNamesArray[indexPath.row] 
cell.nameLabel.text = infectedName

infectedName中密钥infectedGameScoreTotals的值可能会丢失并且是可选的,因此请尝试

let scoreTotal = infectedGameScoreTotals[infectedName]
cell.scoreLabel.text = scoreTotal != nil ? "\(scoreTotal!)" : "n/a"

n/a是一个占位符,以便在字典键不可用时显示。

答案 2 :(得分:0)

您可以尝试使用nil合并运算符并提供默认值,如下所示:

case 1:
    cell.nameLabel.text = infectedNamesArray[indexPath.row] ?? "Some Default String"

这应该可以解开可选的infectedNamesArray[indexPath.row],如果是nil,则替换默认的String