首页 文章

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

提问于
浏览
0

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")

2 回答

  • 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)
    
  • 0

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

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

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

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

相关问题