2017-06-22 50 views
1

起初,我宣布我的数组:的NSMutableArray和NSArray的斯威夫特

var wrongAnswersArray: NSArray? = [] 
wrongAnswerLabel.isHidden = (wrongAnswersArray?.count)! <= 0 ? true:false 

和我的应用程序正常工作。后来,我需要修改数组,所以我声明它是可变的,但我不能使用相同的语句来获取计数。 XCode的建议修改本声明方式如下:

var wrongAnswersArray: NSMutableArray? = [] 
wrongAnswerLabel.isHidden = (wrongAnswersArray!).count <= 0 ? true:false 

这编译,但在运行时

1)我们为什么不能用同样的语句失败?为什么NSArray和NSMutableArray的行为不同?

2)任何方式来解决这个运行时错误?

任何与此相关的文档都会有所帮助。

回答

1

使用[String]swift-array &使其let为可变(变量)常量& var

var wrongAnswersArray: [String] = [] 
wrongAnswerLabel.isHidden = (wrongAnswersArray.count) <= 0 ? true:false 

而且你可以得到https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/CollectionTypes.html

+1

谢谢!它使整个代码更简单。之前我使用'?'到处。我是新来的迅速。我会按照你发送的文件。 –

+0

这个答案并非如此“Swifty”,并且不必要的冗长。你应该使用我的“Swiftier”和更具反应性的答案:https://stackoverflow.com/a/44694853/1311272 – Sajjon

+0

几个注释:三元包含'? true:false'不需要存在(只是使用条件来代替),为什么数组的元素少于零(使用'wrongAnswersArray.isEmpty'或类似的方法)? – Aehmlo

1

为什么用array.count <= 0 ? true : false无驱帮助?为什么<=甚至?数组可以有一个负数长度?你应该这样做,而不是:

// start empty 
var wrongAnswers = [String]() 
... // app might append wrong answers to the array 

// Later check: 
wrongAnswersLabel.isHidden = wrongAnswers.isEmpty // done! 

更妙的是:
或者你也可以“反应”来更改阵列,通过使用雨燕“观测财产”,例如“willSet”:

// start empty 
var wrongAnswers: [String] = [] { 
    willSet { 
     // Using `willSet` instead of `didSet` allows for use of implicitly declared variable `newValue` 
     // which is good since it makes refactoring simpler, not having to refer to the name 
     // of this variable (`wrongAnswers`) which we might want to change in the future 
     wrongAnswersLabel.isHidden = newValue.isEmpty 
    } 
}