swift的下标中的泛型

时间:2014-10-07 04:35:51

标签: swift generics swift-subscript

据我所知,使用Swift,您可以使用以下格式指定特定于函数的泛型:

func someFunction<T>(type: T.Type) {...}

但是,是否有可能与下标做类似的事情?您可以在括号内指定类型,如下所示:

subscript<T>(type: T.Type) -> T {...}

编辑:根据接受的答案更新解决方案

subscript(type: AnyClass.Type) -> Any {
    return sizeof(type)
}

编辑2:经过测试,似乎我实际上无法使用此下标。我得到“CLASS与AnyClass.Type不同”,所以我回到原点

4 个答案:

答案 0 :(得分:9)

您无法将subscript定义为通用函数,但如果在类级别声明它,则可以使用泛型类型。

例如,假设您要创建一个subscript采用类型T并返回类型U的类。这看起来像是:

class SomeClass<T, U> {
    subscript(someParameter: T) -> U {
        /* something that returns U */
    }
}

例如,您可以创建一个Converter类,使用subscript函数将类型T转换为U类型:

注意:这是一个非常人为的例子,我通常不会这样做。

class Converter<T, U> {
    var _converter: (T -> U)

    init(converter: (T -> U)) {
        _converter = converter
    }

    subscript(input: T) -> U {
        let output = _converter(input)
        return output
    }
}

var convert = Converter(converter: {
    (input: Int) -> String in
    return "The number is: \(input)"
})

let s = convert[1]
println(s) // The number is: 1

答案 1 :(得分:4)

通用下标现已在Swift 4中提供:SE-0148

答案 2 :(得分:0)

我不认为这是可能的。相反,您可以使用Any或AnyObject,并将函数的结果转换回指定的类型。

subscript(type: AnyObject) -> AnyObject {
    ...
}

提示:使用type: T.Type

代替type: T

答案 3 :(得分:0)

Swift 4.0支持通用下标

struct GenericDictionary<Key: Hashable, Value> {
  private var data: [Key: Value]

  init(data: [Key: Value]) {
    self.data = data
  }

  subscript<T>(key: Key) -> T? {
    return data[key] as? T
  }
}

// Dictionary of type: [String: Any]
var earthData = GenericDictionary(data: ["name": "Earth", "population": 7500000000, "moons": 1])

// Automatically infers return type without "as? String"
let name: String? = earthData["name"]

// Automatically infers return type without "as? Int"
let population: Int? = earthData["population"]

对于reference