【问题标题】: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 框架中运行基准测试以测试时间和性能。但是您的问题是您只需要将数组转换为可选数组。

标签: arrays swift swift2 var


【解决方案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 是解决这个简单问题的最简单方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-22
  • 2017-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-21
相关资源
最近更新 更多