【问题标题】:typealias generic functiontypealias 泛型函数
【发布时间】:2014-09-21 21:15:12
【问题描述】:

作为学习练习,我正在尝试编写一个小型函数库。我的库中的许多函数都需要传入一个函数。我想为这个函数“键入别名”,以便我的库的用户必须传入一个具有特定签名的函数。

我试过了:

typealias Callback = Result<AnyObject> -> ()

这种工作,但我希望AnyObject 部分是任何东西。不是专门AnyObject,因为那实际上是某种真正的类型(?)。我的Result 枚举我基于这个article 关于Swift 中的错误处理。这是一个通用枚举,所以这就是我想在我的函数签名中体现的内容。

如果我删除 <AnyObject> 部分,我会收到一条错误消息:

对泛型“结果”的引用需要 <...>

中的参数

如果我只是 Result&lt;T&gt; 我得到错误:

使用未声明的类型'T'

据我所知,不可能对泛型进行 typealias。那么..这附近有吗?

TLDR;

我有一堆函数,我想将特定签名的函数作为参数,在我的例子中:

(result: Result&lt;T&gt;) -&gt; ()

我该如何强制?

【问题讨论】:

标签: function generics swift


【解决方案1】:

Swift 4.1 支持泛型类型别名。您可以使用此功能为具有泛型参数的函数提供名称。

您可能必须使用这样的声明:

typealias Callback<T> = (Result<T>) -> ()

【讨论】:

    【解决方案2】:

    正如您所说,没有办法让 typealias 是通用的 (language reference),但您仍然可以在函数定义中包含您的方法签名,只是有点混乱:

    enum Result<T> {
        case Success(T)
        case Failure
    }
    
    func printResult<T>(result: Result<T>) {
        switch result {
        case .Success(let value):
            println(value)
        case .Failure:
            println("failure")
        }
    }
    
    func doSomething<T>(value: T?, f: (Result<T>) -> ()) {
        if value != nil {
            f(Result<T>.Success(value!))
        } else {
            f(Result<T>.Failure)
        }
    }
    
    doSomething(21, printResult)
    // 21
    
    // can't do this, since type inference for the generic
    // Result<T> doesn't work on just `nil`:
    // doSomething(nil, printResult)
    
    let noString: String? = nil 
    doSomething(noString, printResult)  // now calling as doSomething<String>
    // failure
    

    【讨论】:

    • 谢谢,但您误会了。我不清楚,我会更新我的问题。但基本上我只想强制函数的 signature 。我希望我的库的用户能够通过 any 函数体传入 any 函数。
    • doSomething 函数正是如此——它的第二个参数将采用任何具有Result&lt;T&gt; 参数并返回Void 的函数。 printResult 只是一个例子。
    • 抱歉,误读了您的问题。我已经想通了。如果可能的话,我想做的是把f: (Result&lt;T&gt;) -&gt; () 变成f: Callback,以避免一遍又一遍地写第一个!抱歉不清楚。
    • 是的,不行,因为类型别名本身不能是通用的。
    • 我知道我不需要需要,但如果我可以这样做就好了。我有大约 20 个函数,它们都采用相同的回调。除此之外,如果我必须更改回调,它会为我节省大量的工作量。
    【解决方案3】:

    这里我将展示 typealias in swift 2.0 的示例,展示如何在协议定义中使用 typealias:我希望这有助于您理解 swift 2.0 中的 typealias

    protocol NumaricType {
    
    typealias elementType
    
    func plus(lhs : elementType, _ rhs : elementType) -> elementType
    
    func minus(lhs : elementType, _ rhs : elementType) -> elementType
     }
    
    
    struct Arthamatic :NumaricType {
    
    func addMethod(element1 :Int, element2 :Int) -> Int {
       return plus(element1, element2)
    }
    func minusMethod(ele1 :Int, ele2 :Int) -> Int {
        return minus(ele1, ele2)
    }
    
    typealias elementType = Int
    
    func plus(lhs: elementType,  _ rhs: elementType) -> elementType {
        return lhs + rhs
    }
    func minus(lhs: elementType, _ rhs: elementType) -> elementType {
        return lhs - rhs
     }
    }
    

    输出:

         let obj =  Arthamatic().addMethod(34, element2: 45) // 79
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-07
      • 1970-01-01
      • 1970-01-01
      • 2020-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-21
      相关资源
      最近更新 更多