gpt4 book ai didi

Swift Array 扩展,无需强制转换即可按值删除元素

转载 作者:可可西里 更新时间:2023-11-01 01:06:42 24 4
gpt4 key购买 nike

我一直在努力实现 Swift Array 的扩展以按值删除元素。有建议的解决方案使用向下转换,由于与动态类型检查相关的成本,我试图避免这种情况。您能否指出如何编译以下代码。

谢谢,


protocol Removable: SequenceType {
typealias Element
mutating func remove(v: Element) -> Bool
}

func removeElementByValue<T: Equatable>(inout array: [T], valueToRemove: T) -> Bool {
for (index, value) in enumerate(array) {
if value == valueToRemove {
array.removeAtIndex(index)
return true
}
}
return false
}

extension Array: Removable {
mutating func remove(v: T) -> Bool {
return removeElementByValue(&self, v) // compile error here
}

// tried also with:
// mutating func remove<E:Equatable where E == T>(v: T) -> Bool
}

最佳答案

人们使用向下转换的原因......按照:

unsafeBitCast(self, [X].self) // where self is the array and `X` is the type of the passed in value

... 是因为试图以任何方式限制ArrayElement 类型都等同于:

extension Array<T: Equatable> {} // --> Compiler error: Extension of generic type 'Array' cannot add requirements

实现类似功能(不求助于全局函数)的一种方法是推迟与调用代码的比较,直到 Element 的类型被解析并已知为 Equatable 与否:

var array = [1,2,3,4,5]
let filtered = array.filterOut { $0 == 3 }
filtered // --> [1,2,4,5]

...或者,更接近您要实现的目标:

let didRemove = array.remove { $0 == 3 }
didRemove // --> true
array // --> [1,2,4,5]

... 可以实现,例如,如下:

extension Array {

func filterOut(predicate: T -> Bool) -> [T] {
return self.filter { !predicate($0) }
}

mutating func remove(predicate: T -> Bool) -> Bool {
let count = self.count
self = self.filterOut(predicate)
return count != self.count
}
}

关于Swift Array 扩展,无需强制转换即可按值删除元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26159202/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com