当我们可以使用数组在swift中返回多个值时,为什么要使用元组

iam*_*ish 27 tuples ios swift ios8

今天我只是通过一些基本的快速概念,并正在使用一些例子来理解这些概念.现在我已经完成了元组学习.

我有一个疑问,即使用元组需要什么?我在这里做了一些挖掘,这就是我得到的:

我们可以从函数中返回多个值.好的,但我们也可以通过返回一个数组来做到这一点.

数组好,但我们可以返回不同类型的多个值.好的很酷,但这也可以通过AnyObject数组完成,如下所示:

    func calculateStatistics (scores:[Int])->[AnyObject]
{
    var min = scores[0]
    var max = scores[0]
    var sum = 0

    for score in scores
    {
        if score > max{
            max = score
        }
        else if score < min{
            min = score
        }
        sum += score
    }
    return [min,max,"Hello"]
}

let statistics = calculateStatistics([25,39,78,66,74,80])

var min = statistics[0]
var max = statistics[1]
var msg = statistics[2] // Contains hello
Run Code Online (Sandbox Code Playgroud)

我们可以命名元组中存在的对象.好的,但我可以使用AnyObject的字典.

我不是说为什么在我们得到这个时使用元组.但是应该有一些只有元组可以做到的东西,或者只有元组才能做到这一点.而且,如果没有充分的理由,创造swift的人就不会迅速参与元组.所以应该有一些很好的理由让他们参与其中.

所以大家请告诉我,如果有任何特定情况,元组是最好的选择.

提前致谢.

Ant*_*nio 60

元组是可以以多种方式使用的匿名结构,其中之一是使函数中的多个值更容易返回.

使用元组而不是数组的优点是:

  • 多个类型可以存储在元组中,而在数组中,您只能被限制为一种类型(除非您使用[AnyObject])
  • 固定数量的值:您不能传递比预期更少或更多的参数,而在数组中您可以放置​​任意数量的参数
  • 强类型:如果不同类型的参数在错误的位置传递,编译器将检测到,而使用不会发生的数组
  • 重构:如果参数的数量或其类型发生变化,编译器将产生相关的编译错误,而对于未经注意的数组
  • named:可以将名称与每个参数相关联
  • 赋值更容易,更灵活 - 例如,返回值可以分配给元组:

    let tuple = functionReturningTuple()
    
    Run Code Online (Sandbox Code Playgroud)

    或者可以自动提取所有参数并将其分配给变量

    let (param1, param2, param3) = functionReturningTuple()
    
    Run Code Online (Sandbox Code Playgroud)

    并且可以忽略某些值

    let (param1, _, _) = functionReturningTuple()
    
    Run Code Online (Sandbox Code Playgroud)
  • 与函数参数的相似性:当调用函数时,传递的参数实际上是一个元组.例:

    // SWIFT 2
    func doSomething(number: Int, text: String) {
        println("\(number): \(text)")
    }
    
    doSomething(1, "one")
    
    // SWIFT 3    
    func doSomething(number: Int, text: String) {
        print("\(number): \(text)")
    }
    
    doSomething(number: 1, text: "one")
    
    Run Code Online (Sandbox Code Playgroud)

    (在Swift 2中不推荐使用)该函数也可以调用为:

    let params = (1, "one")
    doSomething(params)
    
    Run Code Online (Sandbox Code Playgroud)

这个列表可能并不详尽,但我认为这足以让你更喜欢使用元组来返回多个值


rin*_*aro 11

例如,考虑这个简单的例子:

enum MyType {
    case A, B, C
}

func foo() -> (MyType, Int, String) {
    // ...
    return (.B, 42, "bar")
}

let (type, amount, desc) = foo()
Run Code Online (Sandbox Code Playgroud)

使用Array,要获得相同的结果,您必须这样做:

func foo() -> [Any] {
    // ...
    return [MyType.B, 42, "bar"]
}

let result = foo()
let type = result[0] as MyType, amount = result[1] as Int, desc = result[2] as String
Run Code Online (Sandbox Code Playgroud)

元组更简单,更安全,不是吗?


Sur*_*raj 5

元组是一种比异构阵列重量更轻的数据结构.虽然它们非常相似,但在通过索引访问元素时,优点是可以在Swift中非常容易地构造元组.引入/插入此(元组)数据结构的意图是多种返回类型.以最小的努力从"被调用者"返回多个数据,这是拥有元组的优势.希望这可以帮助!