web-dev-qa-db-ja.com

タプルをSwift配列に追加するにはどうすればよいですか?

タプル(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)
}

...しかし、正しくない。

何か案は? ...解決?

47

これは、配列にタプルを追加するためのグーグルでの一番の回答であるため、最新リリースでは状況がわずかに変更されたことに注意する価値があります。すなわち:

配列を宣言/インスタンス化するとき;型は中括弧内にネストされています:

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

複合代入演算子_+=_は、配列の連結に使用されるようになりました。単一のアイテムを追加する場合、配列にネストする必要があります。

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

名前付きタプルを含む配列でappend()を使用する場合、append()への引数として追加するTupleの各プロパティを提供できることにも注意してください。

_stuff.append((name: "test 2", value: 2))
_
118
Mike MacMillan

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)
12
Alvin Thompson

オプションを削除した場合、正常に機能します。それ以外の場合は、これを行う必要があります。

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)
3
Logan

この問題のために、私は何度もここに行きました。まだ、タプルの配列に追加するのは簡単ではありません。ここに私が今それをどのように行うかの例を示します。

タプルのエイリアスを設定する-キーポイント

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)
2
DogCoffee

Swift 4解決策:

// init empty Tuple array
var myTupleArray: [(String, Int)] = []

// append a value
myTupleArray.append(("One", 1))
2
budidino

注:次の操作を行った場合、機能しなくなります。

array += Tuple 

あなたが必要なものはエラーになります:

array += [Tuple]

Appleより論理的だからこの表現に変更すると思う

1
Yank
 @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)
0

コメントのおかげで:

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)]

0