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???