斯威夫特:不能把一个数组为零
Posted
技术标签:
【中文标题】斯威夫特:不能把一个数组为零【英文标题】:Swift: Cannot put an array to nil 【发布时间】:2016-06-16 03:20:11 【问题描述】:我想要做的是,有一个数组变量,每当它被调用时都会被初始化。为此,我在声明它时使用了lazy
关键字。
但是,我有一个明确的方法,我想清除数组的内容(以恒定的时间复杂度),为此我对数组执行 nil。这给了我一个错误:Cannot assign a value of type NilLiteralConvertible to a value of type [Int]
。我该如何解决?
class Array
lazy var elementsInArray = [Int]()
func add(element: Int)
elementsInArray.append(element)
func clear()
elementsInArray = nil
【问题讨论】:
您确实意识到,您的数组不是可选的,所以它不能为 nil 对吧? 另外,只需使用 removeAll() 函数...正是出于这个原因(对性能的影响绝对可以忽略不计,在大多数情况下甚至不值得考虑)。跨度> 如果您要进行微性能,请考虑将数组设为可选可能还会增加每次访问它的开销。 @TheCodingArt 性能要求很高,无法协商 @NikitaP 我建议您在 XCTest 框架中运行基准测试以测试时间和性能。但是您的问题是您只需要将数组转换为可选数组。 【参考方案1】:有一个方法:
class Array
lazy var elementsInArray = [Int]()
func add(element: Int)
elementsInArray.append(element)
func clear()
elementsInArray.removeAll() //use this.
【讨论】:
removeAll()
使用array.capacity
的复杂度,如方法描述中所述。我想实现删除复杂性中的所有元素 1. 有什么想法吗?
抱歉,不知道该怎么做。【参考方案2】:
要分配任何变量nil
,它应该被声明为一个可选的。 Int
与可选的 Int?
不同。同样[Int]
数组与可选[Int]?
array不同
class Array
lazy var elementsInArray:[Int]? = [Int]()
func add(element: Int)
elementsInArray!.append(element)
func clear()
elementsInArray = nil
所以你应该像上面那样改变它,为数组中的元素分配 nil 值。
【讨论】:
不完全!如果我们写 [Int?] 那么数组将允许添加 nil 值,它是 [Int]?因此数组本身可能是 nil 。 谢谢你。我在做:[Int]?
,虽然我没有意识到我必须明确解开!
。傻我。
@Thilo 不会 lazy
声明处理这个问题,并在访问时分配一个空数组?
@PrajeetShrestha 即使是Lazy
?我认为它的工作方式如下:if nil, assign
懒惰只是在第一次访问时实例化对象。不是在它之后。因此,当我们尝试添加一个元素后,它会是 nil。【参考方案3】:
elementsInArray = []
和 elementsInArray.removeAll()
一样有效
这只是将一个空数组分配给变量。
【讨论】:
这是最好的答案。【参考方案4】:所以,最后我所做的是:
class Array
private var _elementsInArray:[Int]?
var elementsInArray:[Int]?
get
// If while accessing, this array is nil, initiate it with an empty array
if _elementsInArray == nil
_elementsInArray = [Int]()
return _elementsInArray
set
_elementsInArray = newValue
func add(element: Int)
elementsInArray?.append(element)
func clear()
elementsInArray = nil
非常感谢 @PrajeetShrestha 和 @Thilo 帮助我。
【讨论】:
改用 Blakusi 的回答。顺便说一句,定义类数组不是最好的主意.... 过于复杂的问题可以通过可选或空数组来解决。 TBH,我只是想学习,如果这是最重要的,如何做到这一点。我同意使用 removeAll 是解决这个简单问题的最简单方法。以上是关于斯威夫特:不能把一个数组为零的主要内容,如果未能解决你的问题,请参考以下文章
如何在 UIImage 数组中设置第二张或中间的图像? (斯威夫特 3)
如何将数组对象转换为 JSON 字符串。 IOS 8。斯威夫特 1.2