我有点问题。我需要为可以返回协议的每个实现的函数指定返回值。例如:
我的协议:
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
因为我不知道是否必须是ClassA
或ClassB
或Class9000
所以问题是。对于函数MyProtocol.Type
还有另一种返回类型,例如getClassByString()
,还是将ClassA.Type
提升为result
的完全不同的方式?
答案 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