ios - 测试定义为 Any 的值的数组包含,但保证属于同一类型。

标签 ios arrays swift generics equatable

基于 this question of mine (和接受的答案),我想测试数组中值的包含。

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

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

  1. 两种类型(变量和数组元素)一致,并且
  2. 它们是StringIntBool 之一。

到目前为止,我的代码可以正常工作:

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))
})

...但是对协议(protocol) Equatable 的使用的限制阻碍了这一点。有什么建议吗?

最佳答案

我现在明白你要做什么了。这是一个如何让它工作的例子

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
     })

这种方法的缺点是调用 self.getAny(1) 时将返回 int 1true,结果将be [1,1] as 1 and true 可以成功转换为 IntBool 而不是仅仅返回 [1]。 换句话说,如果您的数组中只有 true 而没有 Int 1,您仍然会得到肯定的结果,就好像它存在于您的数组中一样。反之亦然。

关于ios - 测试定义为 Any 的值的数组包含,但保证属于同一类型。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34153315/

相关文章:

ios - 如何在 navigationItem titleView 中将来自 xib 的自定义 View 居中

ios - 发生未指定的错误。 App ID存在于App Store中,无法在ios中移除

IOS/objective-C : Detect Textfield touch but Exclude tap of underlying scrollview

objective-c - 基于 iOS 页面的应用程序清除颜色问题

c++ - 创建多阵列的任意 View

javascript - 如何在 JavaScript 中使用 for 循环/单击事件添加多个按钮?

ios - NSTimeInterval 并查看日期是否超过一个小时

javascript - 使用 javascript 从 iframe 中的数组填充选择选项下拉列表

ios - 如何在 Parse API 中访问字典数组

swift - 循环工作,尝试 map-reduce 时出错