【问题标题】:How to use tuples effectively in function?如何在函数中有效地使用元组?
【发布时间】:2014-09-16 06:26:58
【问题描述】:

Swift 编程书说,

通过返回一个具有两个不同值的元组,每个值都不同 类型,该函数提供有关其结果的更多有用信息 而不是只能返回单一类型的单一值。

摘自:Apple Inc.“Swift 编程语言”。电子书。 https://itun.es/gb/jEUH0.l

我在互联网上搜索但找不到任何示例。所以我尝试了下面的示例,但如果你有更好的方法请告诉我..提前谢谢。

var statusCode = 404
var statusMessage = "No Site"

let http404 = ( sCode : statusCode , sMessage : statusMessage)

func responseFromWS (foo : Int, bar : String) -> (param1 : Int, param2 : String)
{
    statusCode = foo
    statusMessage = bar

    let httpProtocol = ( statusCode , statusMessage)

    return httpProtocol
}


responseFromWS(500, "Internal Server Error")

【问题讨论】:

    标签: function swift tuples ios8


    【解决方案1】:

    在其他语言(包括目标 c)中,您只能返回一个值(任何类型),但在某些情况下,您可能需要返回多个值。

    在这些情况下通常应用的模式是将变量的引用传递给函数以获得所有额外的返回值 - 一个典型的例子是对 NSError * 变量的引用,如果没有发生错误,函数要么将其设置为 nil,或NSError 的实例以防出错。

    使用打包在一个元组中的多个返回值可以快速优雅地解决此类问题。

    您使用此功能的方式似乎是正确的,但错误是在函数范围之外定义 statusCodestatusMessage 变量:

    func responseFromWS (foo : Int, bar : String) -> (code: Int, message: String)
    {
        let statusCode: Int = foo
        let statusMessage: String = bar
    
        return (code: statusCode, message: statusMessage)
    
        // Note: you can also write as follows, because the parameter names are defined in the function signature
        // return (statusCode, statusMessage)
    }
    

    您可以以不同的方式使用返回值。作为一个元组:

    let response = responseFromWS(500, "Internal Server Error")
    
    // Using named parameters
    println(response.code) // Prints 500
    println(response.message) // Prints "Internal Server Error"
    
    // using parameters by index
    println(response.0) // Prints 500
    println(response.1) // Prints "Internal Server Error"
    

    作为单个变量:

    let (code, message) = responseFromWS(500, "Internal Server Error")
    
    println(code)
    println(message)
    

    作为单个变量的子集(如果您只需要返回值的子集):

    // Assign message only, discard code
    let (_, message) = responseFromWS(500, "Internal Server Error")
    
    println(message)
    

    【讨论】:

    • 有用的解释谢谢@Antonio。关于变量声明空间,你是对的。
    【解决方案2】:

    除了@Antonio 提到的用途之外,我还使用它们返回“伪结构”,其中函数计算多个值,但新结构类型的定义实际上不会在其他任何地方使用。

    一个例子:在计算地球表面的真实方位角和距离时,可以选择返回某种极坐标结构,但反向方位角(在真实大地测量学中不是微不足道的关系)也可以计算为产品。在其他语言的实现中,我通过定义一个结构类型来返回三个双精度来做到这一点 - 但是这个结构类型除了调用这个函数之外从来没有使用过!不如说

    let (distance, azimuth, reverseAzimuth) = coordinate(vectorTo: otherCoordinate)
    

    而不是让你未来的自己查找一些晦涩的结构的定义,然后解包。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多