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

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

新規登録して質問してみよう
ただいま回答率
85.47%
Xcode

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

Swift

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

3回答

4018閲覧

swiftで配列を関数の引数にしたときのmutable、immutable

fu_3823

総合スコア81

Xcode

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

Swift

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/08/25 01:50

以下のような構造体と関数を作りました。

swift5

1struct Data: Identifiable { 2 var id: Int 3 var string:String 4} 5 6func makeArray(array:[Data], str:String)->[Data]{ 7 array.append(Data(id:array.count, string:str)) 8 9 return array 10}

関数内で、次のような警告が出ます。
Cannot use mutating member on immutable value: 'array' is a 'let' constant

可変長の配列を作る関数を作りたいのですが、どうしてもimmutableになってしまいます。
どうした良いでしょうか。

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

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

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

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

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

guest

回答3

0

ベストアンサー

関数の引数はimmutableです。
varにコピーしてあげれば変更できるようになります。

swift

1func makeArray(array: [Data], str: String) -> [Data] { 2 var result = array 3 4 result.append(Data(id: array.count, string: str)) 5 6 return result 7}

Swiftの配列は値型なので、最初の代入で、arrayからresultにコピーされます。
実際には、必要になるまでコピーしない最適化が行われるので、パフォーマンスを気にする必要はありません。

投稿2020/08/25 02:32

eytyet

総合スコア803

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

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

0

Swift の関数・メソッドの引数はデフォルトで immutable であり,
よほどの理由がない限りはそのまま immutable なものとして使うべきだと思います.

なので基本的には, array への追加は array を作った側ですべきかなと.

あとは「配列と, それを変更するメソッドを持つ構造体 or クラス」という形なら,
自身のプロパティを弄る分には問題ありませんのでそうして下さい.

なのでどちらかと言えば「どうして, そうしたいのか」が重要になってきます.
基本的には, 引数に渡した配列を弄らなければならない理由はそれほど多くないはずです.

...それでも, どうしても, 引数に配列を渡し, それを弄る必要がある, それが本質である, ということであれば, 手段はあります.
inout というキーワードです.
詳しくは Swift inout とかで調べたら使い方が出てくると思います.

投稿2020/08/25 02:19

kagilinn

総合スコア354

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

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

kagilinn

2020/08/25 02:37

あとこの設計のままであれば, `append` を使わずに `return array + Data(中略)` ですかね. append で変更する理由はどちらにせよあんまり無いです.
guest

0

仮引数はletの扱いなので、仮引数の内容を変更するのであれば、一度代入しなおす必要があります。

Swift

1func makeArray(array:[Data], str:String)->[Data]{ 2 var array = array 3 array.append(Data(id:array.count, string:str)) 4 5 return array 6}

投稿2020/08/25 02:18

TsukubaDepot

総合スコア5086

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問