0

基于我的这个问题(以及公认的答案),我想测试数组中值的包含情况。

该值存储在类型定义为 的变量中Any,数组定义为[Any]

变量中存储的值的实际类型和数组中的元素在运行时决定,但保证满足以下条件:

  1. 两种类型(变量和数组元素)重合,并且
  2. 它们是或String之一。IntBool

到目前为止,我得到了这段代码:

var isContained = false

if let intValue = anyValue as? Int {
    isContained = arrayOfAny.contains({element in return ((element as? Int) == intValue)})
}
else if let stringValue = anyValue as? String {
    isContained = arrayOfAny.contains({element in return ((element as? String) == stringValue)})
}
else if let boolValue = anyValue as? Bool {
    isContained = arrayOfAny.contains({element in return ((element as? Bool) == boolValue)})
}

但是,有很多逻辑重复,我希望我可以让它更聪明,也许是这样的:

isContained = arrayOfAny.contains({element in 
    return ((element as? Equatable) == (anyValue as? Equatable))
})

...但是对使用协议的限制Equatable阻碍了。有什么建议吗?

4

1 回答 1

1

我现在明白你想要做什么了。这是一个如何使其工作的示例

let arrayOfAny:[AnyObject] = [1,7,9,true, "string"]
func getAny(value:AnyObject) -> [AnyObject]{
    return self.arrayOfAny.filter ({$0 === value})
}

上面的函数将返回一个匹配数组,理想情况下应该是单个结果或空数组。

例子:

self.getAny(1) // [1]
self.getAny(0) // []

您也可以修改它以简单地返回一个 Bool

func getAny(value:AnyObject) -> Bool{
  return self.arrayOfAny.filter ({$0 === value}).count > 0
}

例子:

self.getAny(1) // true
self.getAny(0) // false

编辑:

正如 Martin R 所提到的,这并不总是有效的。不幸的是,在发布此答案之前,我没有对其进行全面测试。在玩了一段时间后,我想出了与 NicolasMiari 非常相似的方法:

let arrayOfAny:[AnyObject] = [1,Int.max,9,true, "string"]
func getAny(anyValue:AnyObject) -> [AnyObject]{
    return self.arrayOfAny.filter ({
         var exist:Bool
         switch anyValue.self{
            case is String: exist = $0 as? String == anyValue as? String
                break
            case is Int: exist = $0 as? Int == anyValue as? Int
                break
            case is Bool: exist = $0 as? Bool == anyValue as? Bool
                break
            default: exist = false
            }
            return exist
     })

}

这种方法的缺点是调用结果时将返回的int 1and将是as并且可以成功地转换为 both and而不是可能只打算 return 。换句话说,如果你只是在你的阵列中没有你仍然会得到积极的结果,就好像它存在于你的阵列中一样。反过来也一样。trueself.getAny(1)[1,1]1trueIntBool[1]trueInt 1

于 2015-12-08T12:03:16.053 回答