2

我可以以某种方式强制泛型类型具有泛型类型吗?我想要一些函数,作为参数类型 U,那么我该怎么做呢?

代码:

class TableViewViewModel<T<U>> {
    typealias SectionDataType = T
    typealias RowDataType = U

    var sections = [SectionDataType<RowDataType>]()
}
4

2 回答 2

3

尝试声明一个SectionDataType需要关联类型的协议。这意味着任何符合要求的类型(如下Section所示)都必须实现类型别名。然后,TableViewViewModel您可以通过该类型U别名访问您正在调用的类型。

protocol SectionDataType {
    associatedtype RowDataType
}

struct Section<U>: SectionDataType {
    typealias RowDataType = U
}

class TableViewViewModel<T: SectionDataType> {
    typealias RowDataType = T.RowDataType

    var sections = [T]()
}
于 2017-03-11T20:32:37.500 回答
2

对于泛型,您所要做的就是声明类型(您对尖括号所做的事情)。之后,它的语法照常。我不确定你到底想做什么,所以我只发布一个例子。下面的函数声明了三个泛型类型(T、U、Z),接受一个U类型和一个函数作为参数,函数本身接受一个U类型的值并返回一个T类型的值。所有这些都返回一个类型的值Z. (这是一个非常无用的 func 原样,但是一个如何以复杂方式使用泛型的示例):

func myFunc<U,T,Z>(curry : (U) -> T, value : U) -> Z {
    return curry(value) as! Z
}
于 2017-03-11T20:36:10.993 回答