在Swift中返回依赖于运行时的泛型

在Swift中返回依赖于运行时的泛型,swift,generics,runtime,Swift,Generics,Runtime,我想定义一个根据类内部配置返回泛型类的方法 例如: class-MyClass{ 私有变量返回字符串:Bool func数组()->array{ 如果返回字符串{ 返回[“Hello World”]as![E] }否则{ 返回[1]为![E] } } func changetings(){ returnsString=!returnsString } init(返回字符串:Bool){ self.returnString=returnString } } 让myClass=myClass(ret

我想定义一个根据类内部配置返回泛型类的方法

例如:

class-MyClass{
私有变量返回字符串:Bool
func数组()->array{
如果返回字符串{
返回[“Hello World”]as![E]
}否则{
返回[1]为![E]
}
}
func changetings(){
returnsString=!returnsString
}
init(返回字符串:Bool){
self.returnString=returnString
}
}
让myClass=myClass(returnString:true)
让myStrings=myClass.array()//无法推断泛型参数“E”
我如何才能完成这样的事情,只有在一个工作版本。我假设泛型不是解决问题的方法,因为我的用例需要运行时评估?我可以用(of:)之类的东西吗

我的目标是使用类型安全的
array()
调用创建一个“干净”的API,其中可以推断出
[E]
,如下所示:

让myStrings=myClass.array()

这是对泛型的误解。这一行代码并没有达到您所期望的效果:

func array<E>() -> Array<E>? {
然后函数返回:

func array() -> ReturnType {
    if returnString {
        return .string(["Hello World"])
    } else {
        return .int([1])
    }
}
您的呼叫代码将获得
.string([“Hello World”])

如果
myStrings
有时是
[String]
有时是
[Int]
,那么代码
myStrings[0].count
行会做什么(Int上没有
.count
?它会崩溃吗?静态类型的全部意义在于确定某些东西在编译时是否安全,而不仅仅是在运行时崩溃

你也可以调整你的承诺。例如,您可能会说“这返回一个可以转换为字符串的数组。”


然后您可以安全地调用
description
,查看结果。或者,您可以指定自己的协议,该协议提供您所需的任何函数。

您是否希望
myString
的编译时类型为
String
?不确定为什么需要它,但当您在请求值时设置
returnString
(在
myClass.array()之前)时,也许使用两种方法可以解决您的问题(
myClass.stringArray()
myClass.intArray()
),并在需要时调用所需的方法?@Sweeper是的,字符串数组(更新的问题)@rraphael:
returnString
实际上只会在初始化时设置(更新的问题)@LeoDabus抱歉,我的错误,我确实期待一个字符串数组。
func array() -> ReturnType {
    if returnString {
        return .string(["Hello World"])
    } else {
        return .int([1])
    }
}
let myClass = MyClass(returnString: true)
let myStrings = myClass.array()
func array() -> [CustomStringConvertible] {
    if returnString {
        return ["Hello World"]
    } else {
        return [1]
    }
}