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

时间:2014-11-06 06:38:41

标签: ios swift ios8 tuples

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

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

  

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

     

数组正常但我们可以返回不同类型的多个值。好的很酷,但这也可以通过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
  

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

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

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

提前致谢。

4 个答案:

答案 0 :(得分:59)

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

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

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

    let tuple = functionReturningTuple()
    

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

    let (param1, param2, param3) = functionReturningTuple()
    

    并且可以忽略某些值

    let (param1, _, _) = functionReturningTuple()
    
  • 与函数参数的相似性:调用函数时,传递的参数实际上是一个元组。例如:

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

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

    let params = (1, "one")
    doSomething(params)
    

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

答案 1 :(得分:11)

例如,请考虑以下简单示例:

enum MyType {
    case A, B, C
}

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

let (type, amount, desc) = foo()

使用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

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

答案 2 :(得分:5)

元组是一种比异构阵列更轻的数据结构。虽然它们非常相似,但在通过索引访问元素时,优点是可以在Swift中非常容易地构造元组。引入/插入此(元组)数据结构的意图是多种返回类型。从“被叫者”中返回多个数据&#39;只需很少的努力,这就是拥有元组的优势。希望这有帮助!

答案 3 :(得分:0)

一个元组理想地用于从一个函数返回多个命名数据以供临时使用。如果元组的范围在整个程序中是持久的,则可能需要将该数据结构建模为类或结构。