数组扩展以按值删除对象

数组扩展以按值删除对象

extension Array {
    func removeObject<T where T : Equatable>(object: T) {
        var index = find(self, object)
        self.removeAtIndex(index)
    }}

但是,我在var index = find(self, object)

不可转换为“T”

我还尝试使用此方法签名:func removeObject(object: AnyObject)然而,我也得到了同样的错误:

‘AnyObject’不可转换为‘T’

做这件事的正确方法是什么?


明月笑刀无情
浏览 508回答 3
3回答

ABOUTYOU

截至SWIFT 2,这可以通过协议扩展方法.&nbsp;removeObject()的所有类型上定义为一个方法。RangeReplaceableCollectionType(特别是在Array)如果集合的元素是Equatable:extension&nbsp;RangeReplaceableCollectionType&nbsp;where&nbsp;Generator.Element&nbsp;:&nbsp;Equatable&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Remove&nbsp;first&nbsp;collection&nbsp;element&nbsp;that&nbsp;is&nbsp;equal&nbsp;to&nbsp;the&nbsp;given&nbsp;`object`:&nbsp;&nbsp;&nbsp;&nbsp;mutating&nbsp;func&nbsp;removeObject(object&nbsp;:&nbsp;Generator.Element)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;let&nbsp;index&nbsp;=&nbsp;self.indexOf(object)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.removeAtIndex(index) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}}例子:var&nbsp;ar&nbsp;=&nbsp;[1,&nbsp;2,&nbsp;3,&nbsp;2]ar.removeObject(2)print(ar)&nbsp;//&nbsp;[1,&nbsp;3,&nbsp;2]更新为SWIFT 2/Xcode 7 beta 2:正如空速度在注释中所注意到的,现在实际上可以在对模板有更多限制的泛型类型上编写一个方法,因此该方法现在实际上可以定义为Array:extension&nbsp;Array&nbsp;where&nbsp;Element&nbsp;:&nbsp;Equatable&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;...&nbsp;same&nbsp;method&nbsp;as&nbsp;above&nbsp;...}协议扩展仍然具有适用于较大类型集的优点。更新为SWIFT 3:extension&nbsp;Array&nbsp;where&nbsp;Element:&nbsp;Equatable&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Remove&nbsp;first&nbsp;collection&nbsp;element&nbsp;that&nbsp;is&nbsp;equal&nbsp;to&nbsp;the&nbsp;given&nbsp;`object`:&nbsp;&nbsp;&nbsp;&nbsp;mutating&nbsp;func&nbsp;remove(object:&nbsp;Element)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;let&nbsp;index&nbsp;=&nbsp;index(of:&nbsp;object)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;remove(at:&nbsp;index) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}}

波斯汪

不能在对模板有更多限制的泛型类型上编写方法。注:从SWIFT2.0开始,您现在可以编写以下方法是对模板有更严格的限制。如果您已经将代码升级到2.0,请参阅其他答案,以获得使用扩展实现此功能的新选项。你得到错误的原因'T' is not convertible to 'T'实际上是在定义新的方法中的T与原始T完全无关,如果您想在您的方法中使用T,您可以这样做,而无需在您的方法上指定它。第二个错误的原因'AnyObject' is not convertible to 'T'T的所有可能值并不都是类。对于要转换为AnyObject的实例,它必须是类(不能是struct、enum等)。最好的方法是使它成为接受数组作为参数的函数:func&nbsp;removeObject<T&nbsp;:&nbsp;Equatable>(object:&nbsp;T,&nbsp;inout&nbsp;fromArray&nbsp;array:&nbsp;[T])&nbsp;{}或者,您可以通过返回一个副本来使您的方法更安全和更可重用,而不是修改原始数组:func&nbsp;arrayRemovingObject<T&nbsp;:&nbsp;Equatable>(object:&nbsp;T,&nbsp;fromArray&nbsp;array:&nbsp;[T])&nbsp;->&nbsp;[T]&nbsp;{}作为我不推荐的另一种选择,如果存储在数组中的类型不能转换为方法模板(这是可等价物),则可以让方法以静默方式失败。(为了清晰起见,我使用的是U而不是T作为方法的模板):extension&nbsp;Array&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;mutating&nbsp;func&nbsp;removeObject<U:&nbsp;Equatable>(object:&nbsp;U)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;index:&nbsp;Int? &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(idx,&nbsp;objectToCompare)&nbsp;in&nbsp;enumerate(self)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;let&nbsp;to&nbsp;=&nbsp;objectToCompare&nbsp;as?&nbsp;U&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;object&nbsp;==&nbsp;to&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;index&nbsp;=&nbsp;idx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(index&nbsp;!=&nbsp;nil)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.removeAtIndex(index!) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}}var&nbsp;list&nbsp;=&nbsp;[1,2,3]list.removeObject(2)&nbsp;//&nbsp;Successfully&nbsp;removes&nbsp;2&nbsp;because&nbsp;types&nbsp;matchedlist.removeObject("3")&nbsp;//&nbsp;fails&nbsp;silently&nbsp;to&nbsp;remove&nbsp;anything&nbsp;because&nbsp;the&nbsp;types&nbsp;don't&nbsp;matchlist&nbsp;//&nbsp;[1,&nbsp;3]编辑为了克服沉默的失败,你可以把成功当作一个嘘声:extension&nbsp;Array&nbsp;{ &nbsp;&nbsp;mutating&nbsp;func&nbsp;removeObject<U:&nbsp;Equatable>(object:&nbsp;U)&nbsp;->&nbsp;Bool&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(idx,&nbsp;objectToCompare)&nbsp;in&nbsp;self.enumerate()&nbsp;{&nbsp;&nbsp;//in&nbsp;old&nbsp;swift&nbsp;use&nbsp;enumerate(self)&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;let&nbsp;to&nbsp;=&nbsp;objectToCompare&nbsp;as?&nbsp;U&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;object&nbsp;==&nbsp;to&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.removeAtIndex(idx) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;true &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false &nbsp;&nbsp;}}var&nbsp;list&nbsp;=&nbsp;[1,2,3,2]list.removeObject(2)list list.removeObject(2)list

Smart猫小萌

简明扼要:func&nbsp;removeObject<T&nbsp;:&nbsp;Equatable>(object:&nbsp;T,&nbsp;inout&nbsp;fromArray&nbsp;array:&nbsp;[T])&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;index&nbsp;=&nbsp;find(array,&nbsp;object) &nbsp;&nbsp;&nbsp;&nbsp;array.removeAtIndex(index!)}
打开App,查看更多内容
随时随地看视频慕课网APP