如何在swift中实例化具有不同类型的相同通用协议的多个实例?

时间:2015-03-06 17:57:24

标签: ios swift generics

我有一个通用协议P,我希望其他类B具有不同类型的此协议的不同实例。我想模拟以下行为:

protocol P<T> {
    func getAll() -> [T]
}

class B {
    var foo1: P<Int>

    var foo2: P<String>
}

如何在swift中完成此任务?

3 个答案:

答案 0 :(得分:1)

你无法在Swift中使用协议。你可以做类似的事情:

protocol P {
    typealias T
    func getAll() -> [T]
}

class C : P {
    typealias T = Int
    func getAll() -> [T] {
        return []
    }
}

class D : P {
    typealias T = String
    func getAll() -> [T] {
        return []
    }
}

struct B {
    var foo1: C
    var foo2: D
}

答案 1 :(得分:1)

这可能就是你要找的东西:

protocol P {
    typealias T
    func getAll() -> [T]
}

extension Int: P {
    func getAll() -> [Int] {
        return [1, 2, 3]
    }
}

extension String: P {
    func getAll() -> [String] {
        return ["foo", "bar", "zoo"]
    }
}

class B {
    var foo1: Int = 0

    var foo2: String = ""
}

let x = B()
x.foo1.getAll()
x.foo2.getAll()

答案 2 :(得分:0)

这是你想要完成的吗?

protocol P {
    typealias T
    func getAll() -> [T]
}

class IntGetter: P {
    typealias T = Int
    func getAll() -> [T] {
        return [1,2,3]
    }
}

class StringGetter: P {
    typealias T = String
    func getAll() -> [T] {
        return ["a", "b", "c"]
    }
}

let i = IntGetter()
i.getAll() // [1,2,3]

let s = StringGetter()
s.getAll() // ["a","b","c"]