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

Как добавить кортеж в Swift Array?

Я пытаюсь добавить кортеж (например, 2-элементный кортеж) в массив.

var myStringArray: (String,Int)[]? = nil
myStringArray += ("One", 1)

Что я получаю:

Не удалось найти перегрузку для "+ =", которая принимает поставляемую Аргументы


Подсказка: Я попытался сделать перегрузку "+ =" для каждого справочника:

@assignment func += (inout left: (String,Int)[], right: (String,Int)[]) {
    left = (left:String+right:String, left:Int+right+Int)
}

... но не получилось правильно.

Любые идеи?... решение?

4b9b3361

Ответ 1

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

при объявлении/создании экземпляров массивов; тип теперь вложен в фигурные скобки:

var stuff:[(name: String, value: Int)] = []

теперь используется составной оператор присваивания += для конкатенации массивов; если добавить один элемент, он должен быть вложен в массив:

stuff += [(name: "test 1", value: 1)]

также стоит отметить, что при использовании append() в массиве, содержащем именованные кортежи, вы можете предоставить каждое свойство кортежа, добавляемого в качестве аргумента в append():

stuff.append((name: "test 2", value: 2))

Ответ 2

У вас есть два вопроса. Первая проблема: вы не создаете "массив кортежей", вы создаете "дополнительный массив кортежей". Чтобы исправить это, измените эту строку:

var myStringArray: (String,Int)[]? = nil

в

var myStringArray: (String,Int)[]

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

myStringArray = []

... или вы можете просто изменить первую строку:

var myStringArray: (String,Int)[] = []

После этого эта строка работает отлично, и вам не нужно беспокоиться о перегрузке операторов или других сумасшествиях. Все готово!

myStringArray += ("One", 1)

Здесь полное решение. Столкнувшись с двумя строками, один из них даже не изменился:

var myStringArray: (String,Int)[] = []
myStringArray += ("One", 1)

Ответ 3

Если вы удалите опцию, она отлично работает, в противном случае вам нужно будет сделать это:

var myStringArray: (String,Int)[]? = nil

if !myStringArray {
    myStringArray = []
}

var array = myStringArray!
array += ("One", 1)
myStringArray = array

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

Вы можете сконденсировать это в оператор "+ =":

@assignment func += (inout left: Array<(String, Int)>?, right: (String, Int)) {

    if !left {
        left = []
    }

    var array = left!
    array.append(right.0, right.1)
    left = array

}

Затем вызовите:

var myStringArray: (String,Int)[]? = nil
myStringArray += ("one", 1)

Ответ 4

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

Установить псевдоним для ключевого слова Tuple

typealias RegionDetail = (regionName:String, constraintDetails:[String:String]?)

Пустой массив

var allRegionDetails = [RegionDetail]()

Легко добавить сейчас

var newRegion = RegionDetail(newRegionName, constraints)
allRegionDetails.append(newRegion)

var anotherNewRegion = RegionDetail("Empty Thing", nil)
allRegionDetails.append(anotherNewRegion)

Ответ 5

 @assignment func += (inout left: Array<(String, Int)>?, right: (String, Int)) {
    if !left {
        left = []
    }   
    if left {
        var array = left!
        array.append(right.0, right.1)
        left = array
    }
}

var myStringArray: (String,Int)[]? = nil
myStringArray += ("x",1)

Ответ 6

Благодаря комментариям:

import UIKit

@assignment func += (inout left: Array<(String, Int)>?, right: (String, Int)) {
    if !left {
        left = []
    }
    if left {
        var array = left!
        array.append(right.0, right.1)
        left = array
    }
}

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        let interestingNumbers = [
            "Prime": [2, 3, 5, 7, 11, 13],
            "Fibonacci": [1, 1, 2, 3, 5, 8],
            "Square": [1, 4, 9, 16, 25],
        ]

        println("interestingNumbers: \(interestingNumbers)\n")
        var largest = 0

        var myStringArray: (String,Int)[]? = nil

        myStringArray += ("One", 1)

        var x = 0

        for (kind, numbers) in interestingNumbers {
            println(kind)
            for number in numbers {
                if number > largest {
                    largest = number
                }
                x++
                println("\(x)) Number: \(number)")
                myStringArray += (kind,number)
            } // end Number
        } // end Kind
        println("myStringArray: \(myStringArray)")
    }
}

Выход:

interestingNumbers: [Квадрат: [1, 4, 9, 16, 25], Прайм: [2, 3, 5, 7, 11, 13], Фибоначчи: [1, 1, 2, 3, 5, 8]]

Площадь
1) Номер: 1
2) Номер: 4
3) Номер: 9
4) Номер: 16
5) Номер: 25
Prime
6) Номер: 2
7) Номер: 3
8) Номер: 5
9) Номер: 7
10) Номер: 11
11) Номер: 13
Фибоначчи
12) Номер: 1
13) Номер: 1
14) Номер: 2
15) Номер: 3
16) Номер: 5
17) Номер: 8



Массив тупиков:

myStringArray: [(Один, 1), (Квадрат, 1), (Квадрат, 4), (Квадрат, 9), (Квадрат, 16), (Квадрат, 25), (Прайм, 2), (Прайм, 3), (Прайм, 5), (Prime, 7), (Prime, 11), (Prime, 13), (Фибоначчи, 1), (Фибоначчи, 1), (Фибоначчи, 2), (Фибоначчи, 3), (Фибоначчи, 5), (Фибоначчи, 8)]

Ответ 7

Примечание: Он больше не работает если вы это сделаете:

array += tuple 

вы получите ошибку вам нужно:

array += [tuple]

Я думаю, что яблоко изменится на это представление, потому что оно более логично