gpt4 book ai didi

ios - 如何在函数的返回类型中引用遵循协议(protocol)的类?

转载 作者:搜寻专家 更新时间:2023-11-01 06:09:04 26 4
gpt4 key购买 nike

我有一个名为 Social Service 的协议(protocol),声明如下:

protocol SocialService: class {
class func testFunc()
}

遵循协议(protocol)的类可能如下所示:

class Twitter: SocialService {
class func testFunc() {

}
}

我想要一个方法返回一个遵循这个协议(protocol)的类,所以调用它应该是这样的:

let socialService = socialServiceForServiceType(serviceType: String)

我不确定我需要将什么作为此函数的返回值类型。例如,这个:

func socialServiceForServiceType(serviceType: String) -> SocialService.Type

这里没有给出错误,但是尝试像上面那样调用它,给出了错误:

Accessing members of protocol type value 'SocialService.Type' is unimplemented

编辑:我不想要那种类型的实例,我想要那种类型的类。所以我想要一个 Twitter 类,这样我就可以从上面的 SocialService 协议(protocol)调用类方法。

最佳答案

如错误所述,此功能未实现。然而……

I don't want an instance of that type, I want a class of that type. So I want a Twitter class, so I can call the class methods from the SocialService protocol on it.

我不确定您认为避免这种情况会得到什么。请记住,类不需要有成员变量,如果没有成员变量,它们本质上只是函数指针的集合——这似乎正是您要寻找的。

如果您实现一个没有属性但符合协议(protocol)的 Twitter 类,那么调用该协议(protocol)上的方法将动态分派(dispatch)到该实例的实现:

protocol SocialService: class {
func testFunc()
}

class Twitter: SocialService {
func testFunc() {
println("Testing Twitter!")
}
}

func socialServiceForServiceType(serviceType: String) -> SocialService {
return Twitter()
}

let service = socialServiceForServiceType("blah")

// prints "Testing Twitter!"
service.testFunc()

如果您担心的是要将成员变量放在 Twitter 中类,但不希望某些功能的开销,那么这可能表明您希望将此功能分解为两个不同的类。或者,如果您想要一个单例实例(例如处理连接性),那么还有其他模式可以处理这个问题。

关于ios - 如何在函数的返回类型中引用遵循协议(protocol)的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29411155/

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