質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Swift Playground

Swift Playgroundは、Swiftをインタラクティブに習得できるiPad向けのアプリケーション。コーディングの知識は一切必要なく、Swift Playgrounds上でプログラミングしたコードによりドローン・ロボットを自在に動かすことが可能です。

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

933閲覧

Swiftで、二次元配列の要素の順番を入れ替えたいです。

raijin634

総合スコア1

Swift Playground

Swift Playgroundは、Swiftをインタラクティブに習得できるiPad向けのアプリケーション。コーディングの知識は一切必要なく、Swift Playgrounds上でプログラミングしたコードによりドローン・ロボットを自在に動かすことが可能です。

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2023/05/09 08:16

実現したいこと

Swiftで、二次元配列の要素の順番を入れ替えたいです。

前提

Swift初心者です。
Swiftで、二次元配列の要素の順番を入れ替えたいです。
はじめに、Googleで検索しても良い情報に辿り着けないので、もしかしたら、使っている用語が間違っているかもしれません。
質問内容ですが、例えば var city = [["東京", "愛知", "大阪"], ["北海道", "青森", "秋田"]]
という二次元配列があった時、[["”愛知", "東京", "大阪"], {"青森", "北海道", "秋田"]]
のように、中の配列の要素0と要素1の順番を入れ替えたいと考えています。
swapおよびswapAtについて調べましたが、1次元配列なら使えそうですが、2次元配列で使えるのか、また使い方がわかっていません。
以下のコードは、素人考えでプログラミングしたので、文法等が根本的に間違っていたら、指摘していただきたいです。

発生している問題・エラーメッセージ

Fatal error: Index out of range error: Execution was interrupted, reason: EXC_BREAKPOINT (code=1, subcode=0x18bcdc794). The process has been left at the point where it was interrupted, use "thread return -x" to return to the state before expression evaluation.

該当のソースコード

Swift

1et city: [[String]] = [["東京", "愛知", "大阪"], ["北海道", "青森", "秋田"]] 2 3var array: [[String]] = [[],[]] 4 5for num in 0 ..< city.count { 6 array[num][0] = city[num][1] 7 array[num][1] = city[num][0] 8 array[num][2] = city[num][2] 9} 10 11print(array)

試したこと

以下のコードを書き、とりあえずエラーが出ずに動作しています。
ただ、これが正しいのか、もっと簡潔で良い方法があるのか、わかっていません。

Swift

1let city: [[String]] = [["東京", "愛知", "大阪"], ["北海道", "青森", "秋田"]] 2 3var array: [[String]] = [[],[]] 4 5array[0].append(city[0][1]) 6array[0].append(city[0][0]) 7array[0].append(city[0][2]) 8array[1].append(city[1][1]) 9array[1].append(city[1][0]) 10array[1].append(city[1][2]) 11 12print(array)

補足情報(FW/ツールのバージョンなど)

Swift初心者です。
Xcode 14.3
M2 MacBook Air
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2023/05/09 08:46

let array = city.map { a in [a[1], a[0]] + a[2...] } とか?
guest

回答2

0

ベストアンサー

質問通りの動作を希望するなら

swift

1var city: [[String]] = [["東京", "愛知", "大阪"], ["北海道", "青森", "秋田"]] 2 3for i in (0..<city.endIndex) { 4 city[i].swapAt(0, 1) 5} 6 7// print(city)

です。
これは文字通り入れ替えになりcityのデータ領域は不変です。

swift

1var city = .... 2 3for e in city { 4 e.swapAt(0,1) 5}

はeが定数になるのでできません。

投稿2023/05/09 10:32

MasakiHori

総合スコア3391

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

raijin634

2023/05/10 04:53

回答ありがとうございます。 Playgroundにて、ちゃんと動作することを確認しました。 私がなんとなくイメージしていたコードでした。 swapAtの使い方をもっと勉強したいと思います。 あいがとうございます。
guest

0

以下のコードを書き、とりあえずエラーが出ずに動作しています。
ただ、これが正しいのか、もっと簡潔で良い方法があるのか、わかっていません。

どうして「要素0と要素1の順番を入れ替えたい」のかによるかもしれませんが、
「試したこと」のコードでもOKかなと思いました。


Fatal error: Index out of range

こちらのエラーは、
array変数が必要な数だけ要素を確保できていないからだと思います。
Arrayは要素の数が自動的に変わるものではありませんので
最初に必要な数だけ要素を確保しておけばエラーにならないと思います。
次のような感じで初期値を設定するとかですね。

swift

1let city: [[String]] = [["東京", "愛知", "大阪"], ["北海道", "青森", "秋田"]] 2 3// 初期値を設定します。 4var array: [[String]] = [["","",""],["","",""]] 5 6for num in 0 ..< city.count { 7 array[num][0] = city[num][1] 8 array[num][1] = city[num][0] 9 array[num][2] = city[num][2] 10} 11 12print(array) 13// [["愛知", "東京", "大阪"], ["青森", "北海道", "秋田"]]

swapAtメソッドを使いたい場合についても書いてみますね。

swift

1mutating func swapAt( 2 _ i: Self.Index, 3 _ j: Self.Index 4)

swapAt(::) | Apple Developer Documentation

mutatingのようでしたので、
配列の中身自体を変更するメソッドのようですね。
ですので、一旦varの変数で定義して、
それをswapAtで加工して、
返してあげる感じかなと思いました。

swift

1let city: [[String]] = [["東京", "愛知", "大阪"], ["北海道", "青森", "秋田"]] 2let result = city.map { 3 var mutable = $0 4 mutable.swapAt(1, 0) 5 return mutable 6} 7print(result) 8// [["愛知", "東京", "大阪"], ["青森", "北海道", "秋田"]]

map(_:) | Apple Developer Documentation

*map(_:)メソッドで配列を加工しています

投稿2023/05/09 08:42

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

raijin634

2023/05/09 12:05

丁寧な回答ありがとうございます。 初期値を設定する方法を試しましたが、本番環境では、要素5つの配列が500以上ある2次元配列なので、このやり方が現実的ではないなと思います。 swatAtを使う方は、mutatingやmapについて知識がないので、勉強したいと思います。 結論としては、配列の順番を入れ替えるのではなく、配列は変えずに利用する側を条件分岐等でプログラムする方が簡単だと感じました。 今回の回答を参考に、プログラムを書き直そうと思います。
退会済みユーザー

退会済みユーザー

2023/05/09 13:02

コメントありがとうございます。 初期値を設定するコードにつきまして、 3つの空文字を2つの配列分だけ固定で記述してしまいましたが、 件数を指定して記述することもできるみたいです。 (配列の初期値を500*2だけ記述するのが手間ということでしたら) (違ったらすみません・・) ```swift var array2: [[String]] = Array(repeating: Array(repeating: "", count: 3), count: 2) print(array2) // [["", "", ""], ["", "", ""]] ``` 公式のドキュメントも参照してみると良いかもしれません。 [Collection Types | Documentation](https://docs.swift.org/swift-book/documentation/the-swift-programming-language/collectiontypes/#Creating-an-Array-with-a-Default-Value)
raijin634

2023/05/10 04:57

回答ありがとうございます。 初期値をrepeatingを使って設定する方法を、今後の参考として覚えておきたいと思います。 また、公式ドキュメントも積極的に活用したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問