【问题标题】:How can use Protocol in closure?如何在闭包中使用协议?
【发布时间】:2022-02-03 03:02:02
【问题描述】:

我得到了这个闭包,现在我想使用Numeric 协议而不是Double,我该怎么做?

let test: (Double) -> Double = { value in
    
    // some work ...
    
    return value
}

到目前为止我尝试了什么:

let test<T>: (T) -> T where T: Numeric = { value in
    
    // some work ...
    
    return value
}

【问题讨论】:

  • 这行不通,因为它不是具体类型。见这里:stackoverflow.com/a/25549841/1144632
  • 您所描述的称为一等多态谓语多态。斯威夫特不支持它。如果您编辑您的问题以解释您想要它的原因,我们或许可以帮助您找到替代设计。

标签: swift


【解决方案1】:

我认为这里的问题是 Swift 中的泛型是不变的。例如。 Numeric&lt;Double&gt;Numeric&lt;Int&gt; 是完全不相关的类型。 为什么不能将其转换为函数?

import Foundation

func test<T: Numeric>(value: T) -> T {
    return value + 1
}

let a = test(value: 10)
print(a)

或者,您可以将闭包包装在一个结构中,就像这个答案一样,但此时,只需使用一个函数:https://stackoverflow.com/a/25407534/1144632

【讨论】:

    猜你喜欢
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多