Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何创建面向协议的通用服务?_Ios_Swift_Generics_Swift2_Protocols - Fatal编程技术网

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()
    }
}
相关文档部分: