如何在函数中有效地使用元组?

时间:2014-09-16 06:26:58

标签: function swift tuples ios8

Swift编程书说,

  

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

摘自:Apple Inc.“The Swift Programming Language。”iBooks。 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")

Output

2 个答案:

答案 0 :(得分:2)

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

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

使用包含在元组中的多个返回值,可以在swift中优雅地解决这个问题。

您使用此功能的方式似乎是正确的,但在功能范围之外定义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)

答案 1 :(得分:0)

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

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

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

让你的未来自我查找定义,然后解压缩一些模糊的结构。