【问题标题】:Why to use tuples when we can use array to return multiple values in swift当我们可以使用数组快速返回多个值时,为什么要使用元组
【发布时间】:2015-01-02 14:07:52
【问题描述】:

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

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

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

数组可以,但我们可以返回多个不同类型的值。好的很酷,但这也可以通过 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 的人不会在 swift 中涉及元组。所以他们应该有充分的理由参与其中。

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

提前致谢。

【问题讨论】:

  • 尝试编写一个函数返回两个不同类型的值而不使用元组
  • @BryanChen 您可以看到我添加的示例代码,它返回一个 AnyObject 数组。

标签: ios swift ios8 tuples


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    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
    

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

    【讨论】:

      【解决方案3】:

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

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

      • 多个类型可以存储在一个元组中,而在一个数组中,您只能使用一种类型(除非您使用[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)
        

      这个列表可能并不详尽,但我认为这足以让您偏爱元组而不是数组以返回多个值

      【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-30
        • 2020-10-04
        • 2016-08-24
        • 2019-06-14
        • 2016-06-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多