gpt4 book ai didi

swift - 协议(protocol)所有实现的返回类型

转载 作者:可可西里 更新时间:2023-11-01 02:08:58 31 4
gpt4 key购买 nike

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

我的协议(protocol):

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

那么问题来了。函数 getClassByString() 是否有另一种返回类型,如 MyProtocol.Type 或将 ClassA.Type 获取到 的完全不同的方法结果 ?

最佳答案

我认为您的问题与您描述的不完全相同 - 您的示例的 result 实际上确实是 Playground 中的 ClassA.Type,但问题我怀疑你接下来会用它做什么。您的协议(protocol)没有说明如何以通用方式实例化此类类型,因此返回的类型不能实例化。

我对您的示例进行了一些更改,现在可以使用了...

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

关于swift - 协议(protocol)所有实现的返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41504166/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com