所有协议实现的返回类型

时间:2017-01-06 10:56:10

标签: swift protocols

我有点问题。我需要为可以返回协议的每个实现的函数指定返回值。例如:

我的协议:

protocol MyProtocol {
    //some functions
}

实现:

class ClassA: MyProtocol {
}

class ClassB: MyProtocol {
}

“问题”功能:

func getClassByString(_ name: String) -> MyProtocol.Type {
    switch name {
    case "a":
        return ClassA.self
    case "b":
        return ClassB.self
    default:
        return ClassC.self
    }
}

//编辑:这是我需要结果的地方

final class Mapper<N: MyProtocol> {
    public func map() -> N?{
        if let klass = N.self as? MyProtocol.Type {
            return klass as? N
        }
        return nil
    }
}

用法:

let className = "a" //this String comes from a JSON
let result = getClassByString(className)

let mappingResult = Mapper<result>().map() //undeclared identifier 'result' error
let mappingResult = Mapper<ClassA>().map() //works but i do not know if it is ClassA

问题是result不是ClassA.Type,应该是什么,它现在是MyProtocol.Type,我无法将其传递给下一个函数。 当我给result ClassA.self的具体值时,一切正常。我无法将其投放到as! ClassA.self因为我不知道是否必须是ClassAClassBClass9000

所以问题是。对于函数MyProtocol.Type还有另一种返回类型,例如getClassByString(),还是将ClassA.Type提升为result的完全不同的方式?

1 个答案:

答案 0 :(得分:1)

我认为您的问题并不完全如您所描述的那样 - 您的示例中的result实际上似乎是Playground中的ClassA.Type,但我怀疑的问题是您使用它做了什么下一个。您的协议没有说如何这些类型以通用方式实例化,因此返回的类型不能 实例化。

我对你的例子做了一些修改,现在可以了......

protocol MyProtocol {
    //some functions
    init() // To instantiate generically, there MUST be an accepted pattern for init()
}

class ClassA: MyProtocol {
    required init() {}
}    
class ClassB: MyProtocol {
    required init() {}
}
class ClassC: MyProtocol {
    required init() {}
}

func getClassByString(_ name: String) -> MyProtocol.Type {
    switch name {
    case "a":
        return ClassA.self
    case "b":
        return ClassB.self
    default:
        return ClassC.self
    }
}

let className = "a" //this String comes from a JSON
let result = getClassByString(className) // ClassA.Type
let a = result.init() // ClassA