swift - 如何检查一个对象是否是一个集合? ( swift )

标签 swift generics collections

我广泛使用 KVC 来构建满足应用需求的统一界面。例如,我的一个函数获取一个对象,该对象仅根据字符串键的字典进行多次检查。

因此我需要一种方法来通过键检查对象是否为集合类型。

我希望能够进行一些协议(protocol)检查(如 C# 中的 IEnumerable 来检查它是否可以被枚举),但它没有成功:

if let refCollection = kvcEntity.value(forKey: refListLocalKey) as? AnySequence<CKEntity> { ... }

我也试过 AnyCollection。

我知道我可以迭代所有主要的集合类型,只需键入:

if let a = b as? Set { ...} // (or: if a is Set {...})
if let a = b as? Array { ...}
if let a = b as? Dictionary { ...}

但从继承/多态性的角度来看,这似乎并不合适。

最佳答案

Collection 不能再用于类型检查,因此 Ahmad F 的解决方案将不再编译。

我做了一些调查。有些人建议桥接到 obj-c 集合并使用 isKindOfClass,其他人则尝试使用反射(通过使用 Mirror)。两者都不令人满意。

如果我们关心的是 ArrayDictionarySet,则有一种非常直接、有点粗糙但有效的方法可以通过拆分对象类型来完成任务(列表可以更新):

func isCollection<T>(_ object: T) -> Bool {
    let collectionsTypes = ["Set", "Array", "Dictionary"]
    let typeString = String(describing: type(of: object))

    for type in collectionsTypes {
        if typeString.contains(type) { return true }
    }
    return false
}

用法:

var set : Set! = Set<String>()
var dictionary : [String:String]! = ["key" : "value"]
var array = ["a", "b"]
var int = 3
isCollection(int) // false
isCollection(set) // true
isCollection(array) // true
isCollection(dictionary) // true

硬编码是缺点,但它可以完成工作。

关于swift - 如何检查一个对象是否是一个集合? ( swift ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41236021/

相关文章:

ios - 从 NSMutable 数组中的解析中检索数据,然后从点击按钮的单元格中获取数据

c# - 动态生成 LINQ(成员)表达式

c#-4.0 - C#中动态和T的实际区别是什么

.net - 与C#的default(T)等效的C++/CLI是什么?

java - 如何编写java程序只打印字符串中的重复字符?

kotlin - 为什么 MutableMap.keys 必须返回一个 MutableSet?

ios - Swift 中的多部分 TableView 出现问题

ios - 如何检测应用程序在 iOS 中首次启动?

ios - Swift CoreData : error: Serious application error. 在核心数据更改处理期间捕获到异常。

java - 将 Set<Integer> 转换为原始数组