arrays - 数组扩展,对成员 'subscript' 的引用不明确

标签 arrays swift swift-extensions

我正在尝试在 Xcode 的 playground 中编写 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

但是,如果我尝试从 self 中“获取”一个值,我没有任何问题。例如:

import Foundation

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

没有错误并按预期运行。

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

此外,替换:

self[i] = 0

与,

self.append(0)

也会导致错误。 (不能使用类型为“(Int)”的参数列表调用“追加”)

所以它似乎根本不允许我修改 self。

最佳答案

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

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

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

重要的是要记住,在扩展类似Array 的东西时,您要考虑哪些类型的元素对您要添加的方法有效。如果它需要某种类型的元素,您对其进行约束,然后它就会起作用。这样你就只能在包含整数的 Array 上使用你的 zero() 方法。例如,您可以为 String 数组定义一个不同的版本,用字符串“零”替换数组中的所有内容,并且该实现将仅用于您将其约束到的类型

关于arrays - 数组扩展,对成员 'subscript' 的引用不明确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36453813/

相关文章:

swift - == 和 : in swift extension where condition 有什么区别

ios - 无法声明具有内部要求的公共(public)协议(protocol)扩展

swift - 如何调用 UITableViewCell 内部的 textField (swift)

swift - 添加带有约束的 subview 不起作用

xcode - 自定义 TableViewCell 与高度变化的 subview

ios - 在其自身初始值内使用的变量

swift - 具有可选属性的 UIView 扩展

python - 如何检查有序的非连续子序列是否在数组中? Python

Java 数组和泛型 : Java Equivalent to C# IEnumerable<T>

java - 创建新数组