数组扩展,对成员'下标'的模糊引用

时间:2016-04-06 14:15:21

标签: arrays swift swift-extensions

我试图在Xcode的游乐场写一个Array扩展。我想编写一个函数来修改数组,以便在调用函数时填充0。我尝试使用的代码是:

import Foundation

extension Array {
    mutating func zero() {
        for i in 0..<self.count {
            self[i] = 0 // ERROR - Ambiguous reference to member 'subscript'
        }
    }
}

由于以下错误:

,此代码无法运行
self[i] = 0

然而,如果我试图“获得”&#39;来自自我的价值,我没有问题。例如:

import Foundation

extension Array {
    mutating func zero() {
        for i in 0..<self.count {
            print(self[i])
        }
    }
}

没有错误并按预期运行。

所以我的问题是;为什么我无法修改数组?

另外,更换:

self[i] = 0

用,

self.append(0)

也会导致错误。 (不能使用类型&#39;(Int)&#39;)

的参数列表调用&#39;追加&#39;

所以它似乎不让我修改自我。

1 个答案:

答案 0 :(得分:4)

如果您执行以下操作,它将起作用:

extension Array where Element: IntegerLiteralConvertible {
    mutating func zero() {
        for i in 0..<self.count {
            self[i] = 0
        }
    }
}

您必须限制所允许元素的类型,因为您不能将String的数组清零。

重要的是要记住,在扩展类似Array的内容时,您会考虑哪些类型的元素对您要添加的方法有效。如果它需要某种类型的元素,你就可以约束它,然后就可以了。这样,您只能在包含整数的zero()上使用Array方法。您可以为String数组定义不同的版本,例如,使用字符串&#34; 0和#34;替换数组中的所有内容,并且该实现仅用于您约束的类型它也是如此。