【问题标题】:How to pass a Type as a parameter in Swift如何在 Swift 中将类型作为参数传递
【发布时间】:2015-07-30 17:04:29
【问题描述】:

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

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
}

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

感谢您的帮助和时间

【问题讨论】:

  • 什么是leftNavCompliant
  • 哎呀,我忘了为这个例子做通用的东西,如果让我编辑对象应该是我的

标签: ios iphone swift protocols


【解决方案1】:

我认为这应该可行:

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
}

【讨论】:

    【解决方案2】:

    虽然您可以编写一个泛型方法来过滤数组并查看数组中的哪些内容是给定类型的,但使用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 上的一种方法,它根据测试返回数组的子集。在这种情况下,我们的测试是“元素是字符串吗?” filter 方法接受带有一个参数的闭包,即要测试的元素,上面用 $0 表示。

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

    【讨论】:

    • 所以在这个例子中你现在是通过 sting 过滤的,我希望能够传入 Sting 类型,因为我不知道我想过滤什么!
    猜你喜欢
    • 1970-01-01
    • 2015-03-22
    • 1970-01-01
    • 1970-01-01
    • 2017-10-22
    • 2021-10-20
    • 2018-12-12
    • 2023-03-30
    • 1970-01-01
    相关资源
    最近更新 更多