我讨厌发布这个,因为它看起来像是基本的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]()
答案 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
。