检查泛型类型是否是Swift中的函数类型

时间:2016-10-11 07:48:08

标签: swift function generics types

我已经定义了一个泛型类,如下所示

class A<T:Any>{
   var value:T? 
}

我想知道如何将T限制为函数类型,并且可以在类A中编写类似value()的代码。

let a = A<()->()>()

2 个答案:

答案 0 :(得分:0)

参考Apple's Documentation

  

通用代码使您可以编写灵活,可重用的函数和   可以使用任何类型的类型,具体取决于您的要求   定义

这是使用Generics的主要目的。

在您的情况下,可能,这是如何使用它们的不正确方法。您可能想要更简单:

typealias funcion = ()->()

class A {
    private var value:funcion?

    init(value: @escaping funcion) {
        self.value = value
    }

    func doSomething() {
        print("do something 01")

        if let iplementedValue = value {
            iplementedValue()
        }

        print("do something 02")
    }
}

实例化:

let aObject = A(value: {
    print("I want to this in the middle of my \"doSomething\"")
})

aObject.doSomething()

输出应如下所示:

do somthing 01
I want to this in the middle of my "doSomething"
do somthing 02

希望有所帮助。

答案 1 :(得分:0)

我遇到了类似的问题,最终像这样解决了它:

首先,我定义了一个泛型类型,表示一个接受单个参数并返回值的函数:

typealias Monad<A, R> = (A) -> (R)

然后,我定义我的类以为输入类型采用通用类型参数。就我而言,传递的每个函数都将返回void,因此我不需要两个类型参数。

class HoldsMyCallback<A> {
    let callback: Monad<A, Void>

    init(callback: @escaping Monad<A, Void>) {
        self.callback = callback
    }
}

...

let funcKoozie = HoldsMyCallback<Int> {
    print("keep my \($0) function cold")
}

funcKoozie.callback(1)