Как добавить кортеж в 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)
}
... но не получилось правильно.
Любые идеи?... решение?
Ответы
Ответ 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]
Я думаю, что яблоко изменится на это представление, потому что оно более логично