如何在Swift中传递Type作为参数

时间:2015-07-30 17:04:30

标签: ios iphone swift protocols

我有一个对象字典,我想要做的是浏览数据集并返回符合给定协议的对象数组。我遇到了传递所需协议的语法问题:

func getObjectsThatConformTo<T>(conformance: T.Type) -> [AnyClass]{
  var returnArray: [AnyClass] = []
  for(myKey, myValue) in allCreatedObjects{
    if let conformantObject = myValue as? conformance{
      returnArray.append(conformantObject)
    }
  return returnArray
}

我看到的错误是“一致性”不是一种类型

感谢您的帮助和时间

2 个答案:

答案 0 :(得分:14)

我认为这应该有效:

func getObjectsThatConformToType<T>(type:T.Type) -> [T]{
    var returnArray: [T] = []
    for(myKey, myValue) in allCreatedObjects{
        if let comformantModule = myValue as? T {
            returnArray.append(comformantModule)
        }
    }
    return returnArray
}

答案 1 :(得分:1)

虽然您可以编写一个通用的方法来过滤数组并查看数组中的哪些内容是给定类型,但是这个问题会因使用filter而尖叫。

示例:

var dict: [String: AnyObject] = [:]
// Populate dict with some values
let strings = dict.values.filter { return $0 is String }

包含在类型为

的函数中
func getObjectsThatConformTo<T>(array: [Any], conformance: T.Type) -> [T]? {
    return array.filter { return $0 is T } as? [T]
}

说明: Filter是Array上的一种方法,它根据测试返回数组的子集。在这种情况下,我们的测试是&#39;元素是一个字符串?&#39; filter方法接受一个带有一个参数的闭包,即要测试的元素,上面用$ 0引用。

在此处阅读过滤器:https://www.weheartswift.com/higher-order-functions-map-filter-reduce-and-more/