Подтвердить что ты не робот

Зачем использовать кортежи, когда мы можем использовать массив для возврата нескольких значений в swift

Сегодня я просто проходил некоторые основные быстрые концепции и работал с некоторыми примерами, чтобы понять эти концепции. Сейчас я закончил изучение кортежей.

У меня есть одно сомнение в том, что нужно использовать кортежи? Я сделал несколько рывков на этом, вот что я получил:

Мы можем вернуть несколько значений из функции. Хорошо, но мы также можем сделать это, возвращая массив.

Array ok, но мы можем вернуть несколько значений разных типов. Хорошо, но это также можно сделать с помощью массива 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.

Я не говорю, зачем использовать кортежи, когда мы это получили. Но должно быть что-то, что может сделать только кортеж, или его легко сделать только с кортежами. Более того, люди, которые быстро создали, не стремились бы к скоплению, если бы не было веской причины. Поэтому у них должна была быть веская причина для его привлечения.

Итак, ребята, пожалуйста, дайте мне знать, есть ли какие-либо конкретные случаи, когда кортежи - лучшая ставка.

Спасибо заранее.

4b9b3361

Ответ 1

Кортежи - это анонимные структуры, которые могут использоваться многими способами, и один из них - сделать многократное возвращение нескольких значений из функции.

Преимущества использования кортежа вместо массива:

  • несколько типов могут храниться в кортеже, тогда как в массиве вы ограничены только одним типом (если вы не используете [AnyObject]),
  • фиксированное количество значений: вы не можете передавать меньше или больше параметров, чем ожидалось, тогда как в массиве вы можете указать любое количество аргументов
  • строго типизировано: если параметры разных типов передаются в неправильные позиции, компилятор обнаружит это, тогда как использование массива, который не произойдет
  • рефакторинг: если количество параметров или их тип изменится, компилятор произведет соответствующую ошибку компиляции, тогда как с массивами, которые будут незаметны
  • named: возможно связать имя с каждым параметром
  • назначение проще и гибче - например, возвращаемое значение может быть присвоено кортежу:

    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)
    

Этот список, вероятно, не является исчерпывающим, но я думаю, что этого достаточно, чтобы заставить вас использовать кортежи для массивов для возврата нескольких значений

Ответ 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

Tuple намного проще и безопаснее, не так ли?

Ответ 3

Tuple - это структура данных, которая имеет меньший вес, чем гетерогенный массив. Хотя они очень похожи, при доступе к элементам по индексу преимущество состоит в том, что кортежи могут быть легко созданы в Swift. И намерение ввести/интерполировать эту структуру данных (Tuple) - это множественные типы возврата. Возвращая несколько данных из "вызываемого" с минимальными усилиями, это преимущество наличия Tuples. Надеюсь, это поможет!

Ответ 4

Кортеж идеально используется для возврата нескольких именованных данных из функции для временного использования. Если объем кортежа постоянно в программе, вы можете захотеть смоделировать эту структуру данных как класс или структуру.