swift 无法将类型“Int”的值转换为预期的参数类型“Self.Index”

6jjcrrmo  于 2023-04-10  发布在  Swift
关注(0)|答案(2)|浏览(201)

我想做一个扩展集合的第一个项目与此代码:

extension Collection {
    var firstOneExist: Bool {
        if self.indices.contains(0) {
            return true
        }
        else {
            return false
        }
    }
}

我得到了Cannot convert value of type 'Int' to expected argument type 'Self.Index'的错误,为什么我得到这个错误?索引是Int,所以我使用了0,错误告诉我使用as! Self.Index,但我不知道原因。

mqxuamgl

mqxuamgl1#

可以将computed属性限制为仅可用于索引为整数的集合

extension Collection where Indices.Element == Int {
    var firstOneExist: Bool {
        self.indices.contains(0)
    }
}

示例

let values = [1,2,3,4]
print(values.firstOneExist) // true

let second = values.dropFirst()
print(second.firstOneExist) // false
tp5buhyn

tp5buhyn2#

Collection上的索引没有定义为Int。它是一个名为Index的关联类型。它可能Int,但你不能在这里只使用Int
例如,Dictionary符合Collection,但它的Index是任何Hashable类型。因此可能是String等...
另外...在Int的情况下,第一个索引不一定是0。例如,数组切片不一定有0作为第一个索引。
要获取集合的第一个索引,可以使用self.startIndex
不过,按照你的逻辑我觉得你需要的是...

someCollection.isEmpty

它已经存在于Collection上,和你的函数做的一样。只要在它的前面贴一个!来否定布尔值。

相关问题