【问题标题】:First class generic function in swift?swift中的一流通用函数?
【发布时间】:2016-09-10 04:11:00
【问题描述】:

Swift 具有可以作为参数传递的一流函数。

func a() {
}

func b(x: ()) {
}

// Pass a to b…
b(a)

Swift 有通用函数。

func generic<T>(x: T) {
}

但是,Swift 是否允许我将 generic 函数作为参数传递给另一个函数?

let anIntService = Service<Int>()
let astringService = Service<String>()

func attach<T>(service: Service<T>, to value: T) {
  // Perform type safe attaching of `value` to `service`.
}

func doAttaching(attach: (Service<T>, to T)->Void) {
  attach(anIntService, to: 42)
  attach(aStringService, to: "Hello World!")
}

doAttaching(attach)

…或者它只让我传递一个通用函数的特定实例?

如果可能,请说明定义接受泛型函数作为参数的函数的语法。

如果不支持,解决方法是将泛型函数定义为结构或其他东西的方法,并传递 an 来代替。但这并不理想,因为消费函数没有得到如此好的调用语法,他们需要这样做:

func doAttaching(attach: Attacher) {
  attacher.attach(anIntService, to: 42)
  attacher.attach(aStringService, to: "Hello World")
}

【问题讨论】:

    标签: swift function generics first-class


    【解决方案1】:

    我意识到,在提出这个问题五年后,Swift 支持类似这样的东西,可以通过 callAsFunction 使用。

    这是一个例子:

    
    final class Service<T> {
        // Implementation here
    }
    
    final class Attacher {
        // Important state here.
        var state = Void()
        
        func callAsFunction<T>(service: Service<T>, to: T) {
            // Implementation here.
        }
    }
    
    func doAttaching(attach: Attacher) {
        attach(service: Service<Int>(), to: 42)
        attach(service: Service<String>(), to: "Hello World!")
    }
    
    

    Repeater 可以传递给通用代​​码并提供有用的行为。

    【讨论】:

    • 我要把我自己的问题标记为正确答案,感觉很老套,但已经 5 年了。
    【解决方案2】:

    此功能通常称为Higher-Kinded Types (HKT),目前 Swift 不支持。

    不过,它一直是discussed on the swift-evolution mailing list

    【讨论】:

    • 哈!真的吗? :-) 这很有趣,因为我在过去几次读到过更高种类的类型,但完全不知道他们在说什么。现在我明白了!超级——如果它有一个未来的版本就太好了。谢谢你的回复。
    【解决方案3】:

    是的,这是一个例子:

    func identity<T>(param: T) -> T {
        return param
    }
    
    func callFunction<U>(function: U->U, paramater: U) -> U {
        return function(paramater)
    }
    
    let param = 123
    
    let result = callFunction(identity, paramater: param);
    
    print(result)
    

    (You can run it here)

    【讨论】:

    • 感谢您的回复,但我认为这不能满足我的需要。因此,您示例中的被调用函数callFunction 仍然没有获得通用函数。它正在获取它的一个特定实例,由您调用的parameter 的类型决定——在本例中为123,因此是一个Int。我想将您示例中的identity 作为完全通用 函数传递给callFunction。然后callFunction 的定义可以调用具有多种类型的function 参数。
    • 哦,我明白了,对不起,我误解了帖子:(
    • 没问题!无论如何谢谢:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    • 2021-03-14
    • 1970-01-01
    相关资源
    最近更新 更多