Swift 4.1中如何将任意类或结构体作为函数参数传入?
解决Swift泛型函数中传入类型参数的问题
嘿,我来帮你搞定这个问题!你遇到的Use of undeclared type 'b'错误,核心原因是:b是一个类型元对象(T.Type实例),而Swift的类型转换操作as?后面需要的是编译期确定的具体类型,不能直接用变量来替代。
下面给你两种符合需求的实现方式,分别对应你想要的调用风格:
方式一:传入类型元对象(带.self)
这是最直接的泛型写法,明确传递类型的元对象:
func cast<T>(a: Any, to type: T.Type) { // 这里直接用泛型参数T作为目标类型,而不是变量b if let c = a as? T { print("Good: \(c)") } else { print("Bad") } } // 调用示例 cast(a: 1, to: Int.self) cast(a: "a", to: String.self) cast(a: true, to: Bool.self)
这里的泛型参数T就是我们要转换的目标类型,type参数只是用来让Swift推断出T的具体类型,实际类型转换用的是编译期确定的T,所以不会报错。
方式二:直接传入类型名(无需.self)
如果你希望调用时像cast(a: 1, b: Int)这样简洁,可以利用Swift的类型推断+默认参数来实现:
func cast<T>(a: Any, to type: T.Type = T.self) { if let c = a as? T { print("Good: \(c)") } else { print("Bad") } } // 现在可以这样调用,完全符合你的期望 cast(a: 1, to: Int) cast(a: "a", to: String) cast(a: 3.14, to: Double)
这里给type参数设置了默认值T.self,当你传入Int时,Swift会自动推断出泛型参数T就是Int,从而完成类型转换。
额外简化方案(如果不需要显式传类型参数)
如果你的场景允许,还可以更简洁——直接在调用函数时指定泛型类型,不用传递类型参数:
func cast<T>(_ value: Any) { if let converted = value as? T { print("Good: \(converted)") } else { print("Bad") } } // 调用时在函数名后指定目标类型 cast<Int>(1) cast<String>("a") cast<Int>("这不是整数") // 会打印"Bad"
这种写法更符合Swift的泛型使用习惯,不过如果你的需求必须把类型作为参数传递,前面两种方式更适合你。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

