Ios 如何创建面向协议的通用服务?
我正在尝试创建一个协议,为视图控制器提供数据。我试图采用协议方法,使事情变得灵活,这样视图控制器就可以使用任何类型的数据进行协调 但是,我得到了一个错误:Ios 如何创建面向协议的通用服务?,ios,swift,generics,swift2,protocols,Ios,Swift,Generics,Swift2,Protocols,我正在尝试创建一个协议,为视图控制器提供数据。我试图采用协议方法,使事情变得灵活,这样视图控制器就可以使用任何类型的数据进行协调 但是,我得到了一个错误:协议“可服务”只能用作一般约束,因为它具有自身或关联的类型要求 这就是我想做的: protocol Serviceable { associatedtype DataType func get(handler: ([DataType] -> Void)?) } struct PostService: Serviceabl
协议“可服务”只能用作一般约束,因为它具有自身或关联的类型要求
这就是我想做的:
protocol Serviceable {
associatedtype DataType
func get(handler: ([DataType] -> Void)?)
}
struct PostService: Serviceable {
func get(handler: ([Postable] -> Void)? = nil) {
print("Do something...")
}
}
struct AuthorService: Serviceable {
func get(handler: ([Authorable] -> Void)? = nil) {
print("Do something...")
}
}
protocol Postable {
var title: String { get set }
var content: String { get set }
}
protocol ServiceControllable: class {
var service: Serviceable { get } // Error: Protocol 'Serviceable' can only be used as a generic contraint because it has Self or associated type requirements
}
extension ServiceControllable {
func setupDataSource() {
service.get { items in
// Do something
}
}
}
class MyViewController: ServiceControllable {
let service: Serviceable = PostService() // Error: Same as above
override func viewDidLoad() {
super.viewDidLoad()
setupDataSource()
}
}
我如何设置它,以便我的视图控制器能够实现ServiceControlable,并能够访问填充表、集合等的通用setupDataSource?您想要这样的东西
import UIKit
protocol Serviceable {
associatedtype DataType
func get(handler: ([DataType] -> Void)?)
}
struct PostService: Serviceable {
func get(handler: ([Postable] -> Void)? = nil) {
print("Do something...")
}
}
protocol Authorable {}
struct AuthorService: Serviceable {
func get(handler: ([Authorable] -> Void)? = nil) {
print("Do something...")
}
}
protocol Postable {
var title: String { get set }
var content: String { get set }
}
protocol ServiceControllable: class {
// THIS is the way to use generic-constraint-protocols in protocols.
associatedtype _Serviceable: Serviceable
var service: _Serviceable { get }
}
extension ServiceControllable {
func setupDataSource() {
service.get { items in
// Do something
}
}
}
class MyViewController: UIViewController, ServiceControllable {
let service = PostService()
override func viewDidLoad() {
super.viewDidLoad()
setupDataSource()
}
}
相关文档部分: