タプル(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)
}
...しかし、正しくない。
何か案は? ...解決?
これは、配列にタプルを追加するためのグーグルでの一番の回答であるため、最新リリースでは状況がわずかに変更されたことに注意する価値があります。すなわち:
配列を宣言/インスタンス化するとき;型は中括弧内にネストされています:
_var stuff:[(name: String, value: Int)] = []
_
複合代入演算子_+=
_は、配列の連結に使用されるようになりました。単一のアイテムを追加する場合、配列にネストする必要があります。
_stuff += [(name: "test 1", value: 1)]
_
名前付きタプルを含む配列でappend()
を使用する場合、append()
への引数として追加するTupleの各プロパティを提供できることにも注意してください。
_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)
完全なソリューションは次のとおりです。途方もない2行と1行も変更されませんでした。
var myStringArray: (String,Int)[] = []
myStringArray += ("One", 1)
オプションを削除した場合、正常に機能します。それ以外の場合は、これを行う必要があります。
var myStringArray: (String,Int)[]? = nil
if !myStringArray {
myStringArray = []
}
var array = myStringArray!
array += ("One", 1)
myStringArray = array
空の配列を追加することはできませんので、ある時点で初期化する必要があります。以下のオーバーロード演算子を見ると、それが遅延ロードされてnilにならないようになっていることがわかります。
これを '+ ='演算子にまとめることができます:
@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)
この問題のために、私は何度もここに行きました。まだ、タプルの配列に追加するのは簡単ではありません。ここに私が今それをどのように行うかの例を示します。
タプルのエイリアスを設定する-キーポイント
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)
Swift 4解決策:
// init empty Tuple array
var myTupleArray: [(String, Int)] = []
// append a value
myTupleArray.append(("One", 1))
注:次の操作を行った場合、機能しなくなります。
array += Tuple
あなたが必要なものはエラーになります:
array += [Tuple]
Appleより論理的だからこの表現に変更すると思う
@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)
コメントのおかげで:
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)")
}
}
出力:
interestNumbers:[平方:[1、4、9、16、25]、Prime:[2、3、5、7、11、13、13]、フィボナッチ:[1、1、2、3、5、8]]
平方
1)番号:1
2)番号:4
3)番号:9
4)番号:16
5)番号:25
プライム
6)番号:2
7)番号:3
8)番号:5
9)番号:7
10)番号:11
11)番号:13
フィボナッチ
12)番号:1
13)番号:1
14)番号:2
15)番号:3
16)番号:5
17)番号:8
tupulesの配列:
myStringArray:[(One、1)、(Square、1)、(Square、4)、(Square、9)、(Square、16)、(Square、25)、(Prime、2)、(Prime、3) 、(プライム、5)、(プライム、7)、(プライム、11)、(プライム、13)、(フィボナッチ、1)、(フィボナッチ、1)、(フィボナッチ、2)、(フィボナッチ、3)、(フィボナッチ、5)、(フィボナッチ、8)]