如何检查对象是否是集合? (迅速)

时间:2016-12-20 06:17:15

标签: swift generics collections

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

因此,我需要一种方法来检查密钥对象是否属于集合类型。

我希望能够进行一些协议检查(比如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 { ...}

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

3 个答案:

答案 0 :(得分:2)

尝试使用此功能:

func isCollection<T>(object: T) -> Bool {
    switch object {
    case _ as Collection:
        return true
    default:
        return false
    }
}

通话:

// COLLECTION TESTING //

let arrayOfInts = [1, 2, 3, 4, 5]
isCollection(object: arrayOfInts) // true

let setOfStrings:Set<String> = ["a", "b", "c"]
isCollection(object: setOfStrings) // true

// [String : String]
let dictionaryOfStrings = ["1": "one", "2": "two", "3": "three"]
isCollection(object: dictionaryOfStrings) // true


// NON-COLLECTION TESTING //

let int = 101
isCollection(object: int) // false

let string = "string" // false

let date = Date()
isCollection(object: date) // false

希望这会有所帮助。

答案 1 :(得分:1)

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

硬编码是缺点,但它确实起到了作用。

答案 2 :(得分:0)

您可以创建另一个协议

curl 'http://msa-b1.cgi5.ebay.com/ws/eBayISAPI.dll?EpsBasic' \
-H 'Referer: http://www.picupload.ebay.ca/picupload/main' \
-H 'Origin: http://www.picupload.ebay.ca' \
-H 'User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36' \
-H 'Content-Type: multipart/form-data; boundary=ohaiimaboundary' \
--data-binary $'--ohaiimaboundary\r\nContent-Disposition: form-data; name="s"\r\n\r\nStandard\r\n--ohaiimaboundary\r\nContent-Disposition: form-data; name="n"\r\n\r\ni\r\n--ohaiimaboundary\r\nContent-Disposition: form-data; name="v"\r\n\r\n2\r\n--ohaiimaboundary\r\nContent-Disposition: form-data; name="uaek"\r\n\r\n613\r\n--ohaiimaboundary\r\nContent-Disposition: form-data; name="uaes"\r\n\r\nd2FjaX9ye3QOdgxzC3EOdgxzU3NST3hdVQIEGwcHUwQeAgFRABxRAFRRG1QAVwQGDgkDBlIAdhdzEHEVdhdwZHRyYnh8eG5nf3x2C3EOdgxzC3EOdgAGAwEDDwAHDwkHAAFzEHEVdhdzEGRgc2Nsf3UOdgxzC3EOdgxzBwQLAgIKBwcCBXEVdhdzEHEVc39waXp2bwxzC3EOdgxzC3EFBwJzEHEVdhdzEHR9dW5gYmN6eHYOdgxzC3EOdgxzUgN1XFBrD0hWBWB8UlZLTHIAc35XUUlJYwJ9ZWUAXlVlZ3h2cUZQfmREZ1RyUXdhd3NLZHB1ZGN0B2ByYEZicXVUXXVxWnhyUllXTHR7c2dXXlVEbHlhT2hdXglWcQRdUAJLBHIAc35XUUlJdQJ2eVVUd3ZyQXR3ckZyfnVEXXlyd3dJc3l2YFVbUkt2cWNUVQN9RVcAY35XUUlJdQJ2eVVUTktxQWB/d1Z6fXNEVXJxbnRlUllXTHR7c2dQBQhEV2lDBFNETktwBXR8UlZLTHIAc3dxQXgO\r\n--ohaiimaboundary\r\nContent-Disposition: form-data; name="aXRequest"\r\n\r\n2\r\n--ohaiimaboundary\r\nContent-Disposition: form-data; name="wm"\r\n\r\n\r\n--ohaiimaboundary\r\nContent-Disposition: form-data; name="Filedata"; filename="ebayPic2.jpg"\r\nContent-Type:image/jpeg\r\n\r\nÿØÿà\u00\u10JFIF\u00\u01\u01\u01\u00`\u00`\u00\u00ÿþ\u002Processed By eBay with ImageMagick, z1.1.0. ||B2ÿÛ\u00C\u00\u06\u04\u05\u06\u05\u04\u06\u06\u05\u06\u07\u07\u06\u08\n\u10\n\n\u09\u09\n\u14\u0e\u0f\u0c\u10\u17\u14\u18\u18\u17\u14\u16\u16\u1a\u1d%\u1f\u1a\u1b#\u1c\u16\u16 , #&\')*)\u19\u1f-0-(0%()(ÿÛ\u00C\u01\u07\u07\u07\n\u08\n\u13\n\n\u13(\u1a\u16\u1a((((((((((((((((((((((((((((((((((((((((((((((((((ÿÂ\u00\u11\u08\u03è\u03è\u03\u01\u11\u00\u02\u11\u01\u03\u11\u01ÿÄ\u00\u1b\u00\u01\u01\u00\u03\u01\u01\u01\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u01\u02\u03\u04\u05\u06\u07ÿÄ\u00\u1a\u01\u01\u01\u00\u03\u01\u01\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u01\u02\u03\u05\u04\u06ÿÚ\u00\u0c\u03\u01\u00\u02\u10\u03\u10\u00\u00\u01ñy\u7f`\u00\u00\u00?Aõð¾·ÓÌ\u00\u00\u00\u00\u00\u00\u00~SÏúo\u1f_¨\u00\u00\u03ê·ó\u7fDöð@\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00üG\u97ö\u00\u00)\u00?Aõð¾·ÓÌ\u00\u00\u00\u89T\u00\u00\u00~SÏúo#W¨\u05@\u00>«\u7f7ôOo\u04\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u0fĹ\u7fa\nBÀR\u00ý\u03ÙÂúßO0\u00\u00\u03âü½o¤ßÏô3Ò\u00\u00\u01ùO?é¼}~ \u00\u00\u0fªßÍý\u13ÛÁ\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u03ñ\u1e_Ø\n\u00\u80\u00ý\u03ÙÂúßO0\u00\u00\u1c¸çù\u17;êþ\u83w\u83ô\u7fo\u00\u00\u00\u03ò\u9e\u7fÓxúý@\u00\u00\u1fU¿\u9bú\'·\u82\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u01\u0cL\u0c\u08H\u14µJ\u0cÍ\u80\u00\u00\u00\u00\u00\u00\u00~%Ëû\u12!HP\u00~\u81ëá}o§\u98\u00\u03ÆÕéòðõy\u1a½_+£§\u91ú7·çü½~\u8f¹õñè\u00\u03ò\u9e\u7fÓxúý@\u00\u00\u1fK¿\u9bú\u07·\u83\u91\u99\u91\u90\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00\u00!\u89\u81\u89¬Ò\u98\u15m"\u84ÈÉr(\u09\u00\u00Ä\u86E\\£#:ÈÈ \u00\u00\u00\u00~#Ëû\u01`\u05@\u01ú\u0f¯\u85õ¾\u9e`\u00\u0e\u1c6þ?Îú°\u00÷6øÿ\u00R÷üØ\u00\u01ùO?é¼}~ \u00\u00\u0f¢ßÍû\u8fo\u04\ndl:\u8cÀ\u00\u00\u00\u00\u00\u00\u00\u00\u00!Îj0 5\u98\u9b\u13ug)\u04)\u00\u00\u00\u00\u00\u85!\u0c\u80)µw\u00\u00\u00\u00\u0fÄy\u7f`(\u81(\u00?Aõð¾·ÓÌ\u00k\u8ds-÷\u1fƹ¿[Ï3\u00}\u8f£\u93÷¾Î/.9õe\u80\u00~SÏúo\u1f_¨\u00\u00\u03è·ó~ãÛÁ\u00\rd=s \u00\u00\u00\u00\u00\u00\u00\u00\u02\u1cÆ \u10\u14©\u02\u90\u00\u00\u00\u00\u00\u00\u00\u00\u00Srí\u00\u00\u00\u00üG\u97ö\u02Â\u91(\nCô\u1f_\u0bë}<Áñþn§¡\u9e\u8e|sùm\u1d?Ó=ß;ù\u9f\u87èü-^À\u07è¾Î\u07¥³Ïù×\u8b¿úG·ç¼½~®\u9cµ{û¼cò\u9e\u7fÓxúý@\u00\u00\u1fE¿\u9b÷\u1eÞ\u08\u80\u879\u0fXé\u00\u00\u00\u00\u00\u00\u00\u00\u005\u18\u00\u0b$0¶ \u00\u00\u00\u00U\u81\u00\u05 \u00 \u12\u14ؽ\u00\u00\u00\u00\u1f\u88òþÂ\u81\n\u80\u00~\u83ëá}o§\u98?5ðý\u07Íéè\u01ô»¹ø\u9f9§ \u00ûß_\u0fã|½\u8eI°\u0fÓ=¿;ô[ü#ò\u9e\u7fÓxúý@\u00\u00\u1fE¿\u9d÷\u1eÞ\u04\u00Ñ\\æqî\u1b@\u00\u00\u00\u00\u00\u00\u00\u00\rF \u03i©5\u15b\u00\u00\u00\u00\u00\u05 \u00 \u02\u01\nft¨\u00\u00\u00\u1f\u89r¾ÁH\u02P\u00~\u83ëá}o§\u98>KÏÓüûÇÝ\u00\u00\u00\u00\u0cÓöN\u9fÉo¸\u8fÊyÿ\u00Mãëõ\u00\u00\u00}\u16þoÜ{x0\u18\u1c\u95®=\u03Ó6\u00\u00\u00\u00\u00\u00\u00\u00\u00\u1aH\u006\u9aÍ ©\u00\u00\u00\u00\u00\u00\u14\u02\u00\u00\u18\u99\u19\u9d*\u00\u00\u00\u07â\\¯°R\u00\u94\u00\u1f úø_[éæsc\u97ç\u9e>ÿ\u00Îé÷\u80)\u00\u00\u15blO½öpþ·ÑÌ\u1f\u94óþ\u9bÈ×ë$\u00\u00\u0f¢ßÍû\u8fo\u06\u03\u9a¹L£Ú:\r\u80\u00\u00\u00\u00\u00\u00\u00\u00\u06\u92\u00\r¦³\u03YB@P\u00\u00\u00´\u89H\nE\u00\u94\u8aHR\u9dj\u00\u00\u00\u07â<¿°\u14B \u00\u1f úø_[éæCä|ÝO\u83òvðP\u00\u00\u00\u07¡\u9e\u8fÒ½¿;êlÐ?)çý7\u8f¯Ô\u00\u00\u01ô{ù¿síàÃ\u13\u8a¹ãÐ=\u13a´\u00\u00\u00\u00\u00\u00\u00\u00\u00Ò@\u08n5\u98\u1102X\u90 \u14\u02-\u00 (\u00\u00\u01 )\u17°\u00\u00\u00\u03ñ.WØJ¢\u04 \u00ý\u07×ÂúßO0\u0f\u0fW¯ó\u7f\u0fÐòÍ\u80\u00\u00\u03ßÛáý\u1bÛÀéË\u00?)çý7\u8f¯Ô\u00\u00\u01ô{ù¿míàâfbyÇ´fm6\u80\u00\u00\u00\u00\u00\u00\u00\u00\u1aLJ@n5\u98\u14Á!V¦ \u00U\u00\u00\u00\u00\u00\u00$\u06+Ü\u00\u00\u00\u01ø\u97+ì%XR%\u00\u07è>¾\u17Öúy\u80\u0e\u0c6þkáú/+\u0fH\u00R\u15~ÇÓÈû\u9fW\u17:\u00~SÏúo\u1f_¨\u00\u00\u03è÷ó~çÛÁÐi®\u88Õ\u1e\u95\r\u86à\u00\u00\u00\u00\u00\u00\u00\u00\u03I\u00$n5Ö \u1aÒ\u98\u94\u05 \u00\u00\u05 \u00¤\u00\u00CYè\u00\u00\u00\u00~#Ëû\u01D\u09@\u01ú\u0f¯\u85õ¾\u9e`\u00|þ\u9foæ>\u1f£\u00U\u85:²Õû\u17Käª\u80\u07å<ÿ\u00¦ò5úÉ\u00\u00\u03è÷ó~çÛÁ\u1e]v\u12=\u02\u9b\rÀ\u00\u00\u00\u00\u00\u00\u00\u00\u06\u92\u00HÚaX\u14\u10Ö\u82\u19\u02©!N\u1aù\u89~\u94ô\u00\u04O9w\u9d`¤\u00¤5\u1e\u80\u00\u00\u00\u07â\\¯°\u95aH\u94\u00\u1f úø_[éæ\u00\u07\u85«Ùæëôz\u19èïÏGÏé÷}\u1eî\u7f4ÙÁ\u86ÿ\u00?\rÿ\u00[èåôe\u88\u00~SÏúo\u1f_¨\u00\u00\u03è÷ó~çÛÁ\u1e]u\u99Gp7\u1b@\u00\u00\u00\u00\u00\u00\u00\u00\r& \u08ÚaX\u02\u90Ö\u83\u15Í)\u14\u10x\u95ðxgú\u1eXú \u03Yù\u069þ\u8f\u96\u1eà)\u00)\rG \u00\u00\u00\u01ø\u97/ì\u02\u00\u94\u00\u1f úø_[éæ\u00\u00\u00|\u8f\u9b§õ>\u8enÛ\u00\u00\u00?)çý7\u8f¯Ô\u00\u00\u01ô{ù¿uíàÃË®³(î\u06Óp\u00\u00\u00\u00\u00\u00\u00\u00\u01¤\u84\u026\u98V°PkA\u8aæ\u82\u90)<Y~+\u1cþó<=@\u02k?(Ãgßå\u87¹@R\u14\u10Ôz\u00\u00\u00\u00\u1f\u89r¾Á@\u08\u00\u07è>¾\u17Öúy\u80\u00\u00\u1f\u19åë}_£\u97Ñ\u96 \u00\u00\u1f\u94óþ\u9bÇ×ê\u00\u00\u00ú=üߺöðaå×Y\u94w\u03i¸\u00\u00\u00\u00\u00\u00\u00\u00\u00Òb\u01#q\u85k\u00\u1aÐC0\n¢\'\u8d/Äã\u97Þç\u8f¦\u00Mgåzö}îÌ=²\u90\u14\u02\u1a\u8f@\u00\u00\u00\u03ñ\u1e_ØR\u00\u00\u00ý\u07×ÂúßO0\u00\u00\u03â<½\u8f­ôrú²Ö\u00\u00\u01ùO?é¼}~ \u00\u00\u0f£ßÍû¯o\u06\u1e]u\u99bî¡´Ü\u00\u00\u00\u00\u00\u00\u00\u00\u00k5\u80Cq\u81¬\u02\u9aÐbf\n\u08¤ñåø¬sû¼ðôÀ\u06´ü»^ϽÙ\u87°P@\n\r\u07¢\u00\u00\u00\u01ø\u8f/ì\u00\u00\u00\u07è>¾\u17Öúy\u80\u00\u00\u1e\u1e¯_«\u9f\u9b~X\u80\u00\u00~SÏúo\u1f_ª\u90\u00\u00>\u93\u7f7î}¼\u18yuÖe\u1dÀÚn\u00\u00\u00\u00\u00\u00\u00\u00\u00! \u02\u1b\u8c\r`\u14Ô\u82.iHR-O(ù\u09\u9fÙÜ}\u10\nb\u9e"úgP\u00\u00\r\u07¢\u00\u00\u00\u01ùo?é\u00\u00\u00\u07Øzy?E¿Ã\u0cAL@ \u00\u00\u00\u00üÿ\u00ÇÜó°ô\u00\u00\u00{[¼_WéäCË®¸Èî\u06Óp\u00\u00\u00\u00\u00\u00\u00\u00\u01\r$\u046¤]@\u03ZS\u135  ,LJ¹\u14\u00@\u01A\n\u08i=\u10\u00\u00\u00\u00\u00\u00\u00\u00\u1cà\u1cà¦\u04(\u05!H\u00\u00¥!H\u00\u00\u87\u99]eÅÝCi¸\u00\u00\u00\u00\u00\u00\u00\u00\u00\u86\u80\u09\u1b\u8ckP\u05ME16,J\u14\u00\u05 \u05\u00\u80 \u80 Òz\u00\u00\u00\u00\u00\u00\u00\u00\u009À9À0(\u00 \u02\u10ã4\u1e\u99J\n@\u00\u04<Êë\u8b\u1dÔ6\u9b\u80\u00\u00\u00\u00\u00\u00\u00\u00\u08h\u00\u91´\u95¨\u14&°bf\n\u14\u00\u0805®Ó"\u80\u01\n\u01\rG \u00\u00\u00\u00\u00\u00\u00\u00\u03\u9c\u03\u9c\u03\u02\u80P\u08\u01ä\u9f\u8d˧\u17é\u15÷\u19JP\u08\u00\u04<ºë\u8c£¶\u86ãp\u00\u00\u00\u00\u00\u00\u00\u00\u01\r\u00\u10ÚCP\u055%16,*\u02\u90\u16\'\u09øÖ\u19{Òþ\u89\u9e>\u8dd\u00!@)\r\' \u00\u00\u00\u00\u00\u00\u00\u00\u03\u9c\u03\u9c\u03\u02\u80P\u00!ùÝ~c\u8btz6þûd(\u00\u80\u00yu×\u14î!¸Ü\u00\u00\u00\u00\u00\u00\u00\u00\u00\u0ep\u08mHº\u81H\u98\u03\u13`\u042XR$>\n¿%Ã....... 

protocol CountableCollection { var count: Int { get } } extension Array: CountableCollection where Element: Any { } extension Dictionary: CountableCollection where Key == String, Value == Any { } 所需的所有方法添加到已创建的新协议中(我仅添加了Collection getter进行演示)。


在此之后,您可以简单地

count

someVar如果为if someVar is CountableCollection { print(someVar.count) } Array,则为true。如果需要,您还可以使其符合Dictionary