Swift 3中通用协议类型的变量

时间:2016-10-17 11:50:57

标签: swift generics swift-protocols

是否可以在Swift中声明一个具有通用协议类型的变量?

如果不是,有哪些替代方案?这似乎是巨大的缺点,我无法重用具有不同类型参数的协议,更不用说模拟它了。

2 个答案:

答案 0 :(得分:0)

我不确定这是不是你的意思,但你可以这样做:

public typealias SuccessBlock<T> = (_ data: T) -> (Void)

然后定义变量:

var myBlock: SuccessBlock<String>

答案 1 :(得分:0)

我的解决方法是非通用协议。 同意有害的奇怪限制。 缺少关联类型的限制必须使用协议中的元素的基础,所有其他内部可以使用泛型类型

//: Playground - noun: a place where people can play

import UIKit
import Foundation

class Item: NSObject {

}

protocol Datasource {

    subscript(index: Int) -> NSObjectProtocol? { get }
}

class BaseDatasource<Element: NSObjectProtocol>: Datasource {

    private(set) var data: [Element]?

    subscript(index: Int) -> NSObjectProtocol? {
        get {
            return data?[index]
        }
    }

    func sortedData(_ data: [Element]) -> [Element] {
        return data
    }
}

class ItemsDatasource: BaseDatasource<Item> {
    ///some specific code
}

var dataOfInts: Datasource?

dataOfInts = ItemsDatasource()//or BaseDatasource<Item>()