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

Function 如何在函数中有效地使用元组?,function,swift,tuples,ios8,Function,Swift,Tuples,Ios8,斯威夫特的编程书说 通过返回一个具有两个不同值的元组,每个值都不同 类型,则函数提供有关其结果的更有用信息 如果它只能返回单一类型的单一值 摘自:苹果公司《Swift编程语言》。iBooks 我在网上搜索了一下,但找不到任何例子。所以我试着像下面的例子一样,但如果你有更好的,请让我知道。。提前谢谢 var statusCode = 404 var statusMessage = "No Site" let http404 = ( sCode : statusCode , sMessage :

斯威夫特的编程书说

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

摘自:苹果公司《Swift编程语言》。iBooks

我在网上搜索了一下,但找不到任何例子。所以我试着像下面的例子一样,但如果你有更好的,请让我知道。。提前谢谢

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")
在其他语言(包括objective c)中,您只能返回一个值(任何类型),但在某些情况下可能需要返回多个值

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

使用封装在元组中的多个返回值在swift中优雅地解决了这个问题

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

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)
作为单个变量的子集(如果您只需要返回值的子集):


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

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

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

而不是让你未来的自己去查阅定义,然后打开一些模糊的结构

有用的解释谢谢@Antonio。关于变量声明空间,您是对的。
let (distance, azimuth, reverseAzimuth) = coordinate(vectorTo: otherCoordinate)