我可以指定可以将类实例转换为某种类型吗?

时间:2015-09-06 14:24:53

标签: swift

说我有一个通用类

class Foo<T> { … }

我可以以某种方式指定此类的实例可以在作业中转换为T吗?例如:

let foo = Foo<Int>()
func useAnInt(a: Int) {}

let getTheInt: Int = foo
useAnInt(foo)

3 个答案:

答案 0 :(得分:1)

你无法按照自己的要求行事。尽管Foo定义了泛型类型T,但Foo的实例仍然是Foo,并且无法转换为泛型类型。您在类级别声明泛型类型的原因是在整个类中使用多个位置。

class Foo<T> {
    var value: T

    init(withValue: T) {
       self.value = withValue
    }

    func getSomeValue() -> T {
        return self.value
    }
}

泛型并不意味着类本身是通用的并且可以转换。

答案 1 :(得分:1)

实现目标的一种方法是为您的类可以转换为的每种目标类型使用专用协议。这是一个非常基本的例子:

protocol BoolAdaptable {
    func adaptToBool() -> Bool
}

protocol IntAdaptable {
    func adaptToInt() -> Int
}

protocol FloatAdaptable {
    func adaptToFloat() -> Float
}

class Foo: BoolAdaptable, IntAdaptable, FloatAdaptable {

    var v: NSNumber

    init(_ v: NSNumber) {
        self.v = v
    }

    func adaptToBool() -> Bool {
        return v.boolValue
    }

    func adaptToInt() -> Int {
        return v.integerValue
    }

    func adaptToFloat() -> Float {
        return v.floatValue
    }

}

let foo = Foo(NSNumber(double: 1.23))

let getTheBool = foo.adaptToBool() // true
let getTheInt = foo.adaptToInt() // 1
let getTheFloat = foo.adaptToFloat() // 1.23

这可以很容易地扩展到支持更复杂的转换。

答案 2 :(得分:1)

为什么不直接使用底层类型? (类似于@ MrBeardsley的答案)

class Foo<T> {
    var t : T

    init(t: T) {
        self.t = t
    }
}


let foo = Foo(t: 3)
func useAnInt(a: Int) {}

let getTheInt: Int = foo.t
useAnInt(foo.t)