Swift 协议方法的不同返回类型
我希望有一个协议来定义一些方法和属性。然而,符合所述协议的不同类之间的属性类型和方法返回类型可能不同。例如:Swift 协议方法的不同返回类型,swift,Swift,我希望有一个协议来定义一些方法和属性。然而,符合所述协议的不同类之间的属性类型和方法返回类型可能不同。例如:A.getContent()可以返回类型为String的值,但是B.getContent()可以返回类型为Int的值。在下面的示例中,我使用了类型Any。这在Swift中是可能的还是完全错误的方法?也许是泛型药 protocol Content { func getContent() -> any } class A: Content { func getConte
A.getContent()
可以返回类型为String
的值,但是B.getContent()
可以返回类型为Int
的值。在下面的示例中,我使用了类型Any
。这在Swift中是可能的还是完全错误的方法?也许是泛型药
protocol Content {
func getContent() -> any
}
class A: Content {
func getContent() -> String {
return "Im a String"
}
}
class B: Content {
func getContent() -> Int {
return 1234
}
}
您可以使用泛型和元类型:
protocol Content {
func getContent<T>(ofType: T.Type) -> T?
}
class A: Content {
func getContent<T>(ofType: T.Type) -> T? {
return "Im a String" as? T ?? nil
}
}
class B: Content {
func getContent<T>(ofType: T.Type) -> T? {
return 1234 as? T ?? nil
}
}
let aClass = A()
let aValue = aClass.getContent(ofType: String.self) // "Im a String"
let bClass = B()
let bValue = bClass.getContent(ofType: Int.self) // 1234
协议内容{
func getContent(ofType:T.Type)->T?
}
A类:内容{
func getContent(ofType:T.Type)->T{
将“ima String”返回为?T??nil
}
}
B类:内容{
func getContent(ofType:T.Type)->T{
将1234返回为?T??零
}
}
设aClass=A()
让aValue=aClass.getContent(ofType:String.self)/“我是一个字符串”
设bClass=B()
让bValue=bClass.getContent(ofType:Int.self)//1234
我认为您正在研究协议中的泛型。
例如,您可以将类型与关联类型
动态关联
protocol Content{
associatedtype T
func getContent()-> T
}
class A: Content {
func getContent() -> String {
return "Hello World"
}
}
class B: Content {
func getContent() -> Int {
return 42
}
}
A().getContent() //"Hello World"
B().getContent() //42
如果您在内容类sun中的函数之后放置类型,那么看看这个示例,协议内容将是这种类型
更新
我举了另一个例子,使用“flyingly”语法代替传统的getContent
protocol Content{
associatedtype T
var content:T { get }
}
class A: Content {
var content:String{
return "Hello World"
}
}
class B: Content {
var content:Int{
return 42
}
}
A().content //"Hello World"
B().content //42
看看:)可能是泛型。看起来不错!问题是我当时无法使用它。例如,在另一个类中,我尝试了
func addContent(content:content){…}
,但Xcode显示:协议“content”只能用作泛型约束,因为它具有自身或关联的类型要求
与仅尝试创建数组相同:var contents=[content]()
@Mick这是因为带有关联类型字符串的内容
与带有关联类型Int的内容
是完全不同的类型。没有真正的解决方法,它们只是不兼容。@Mick根据您想要实现的目标,您有几个选项可供选择。对于函数输入,可以为单个函数引入通用占位符(即func addContent(content:T){…}
),对于类属性或方法,可以为类本身引入通用占位符。如果您需要讨论异构的内容
类型(即“任何符合内容
”的内容),您需要看看。@Hamish有没有一种方法可以实现返回[String]和上面示例中的另一个Int???