斯威夫特:不能把一个数组为零

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 是解决这个简单问题的最简单方法。

以上是关于斯威夫特:不能把一个数组为零的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 283 移动零

如何在 UIImage 数组中设置第二张或中间的图像? (斯威夫特 3)

基于正则表达式从字符串中提取字符串数组? - 斯威夫特

如何将数组对象转换为 JSON 字符串。 IOS 8。斯威夫特 1.2

如何在字典数组中转换 FIRDataSnapshot?斯威夫特 3

从 Firebase 填充的 CLLocationCoordinate2D 数组不会保留其条目。斯威夫特 4