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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

Q&A

解決済

2回答

2133閲覧

Swiftのstructは、どのようなケースで使うと効果的ですか

yoneapp

総合スコア85

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

0グッド

2クリップ

投稿2015/08/02 10:45

Swiftのstructはclassとよく似ているところがありますが、どのように使い分けるのでしょうか。

structの性質を使った、実際の実装パターンなどありましたらご教授をお願いできればと思います。

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

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

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

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

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

guest

回答2

0

ベストアンサー

structは主に

  • 単純なデータを意味のあるまとまりにしたい場合

に使います。

classと違うところとしては

  • 変数に入れるときに値渡しになる
  • 継承ができない

といった点があるので、ここが使い分けのポイントでしょう。
(参照渡ししたい、継承したい場合はclassを使う)

典型的なstructの使い方の例としてはCGRectやCGSizeがあります。
xやy, widthやheightといった単純なCGFloat型の値を、意味あるまとまりとして扱えてわかりやすいのと、それらを扱う共通の処理を定義できて便利です:-)

投稿2015/08/02 15:34

jollyjoester

総合スコア1585

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

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

0

structは、比較的サイズの小さい構造体を作るのに適しています。
classのインスタンスはヒープ上に実体が作られますが、structのインスタンスはスタック上に実体が作られます。
文法的には、サイズを問わず全ての構造体をstructで定義すべきですが、サイズが大き過ぎると値渡しでコピーが発生して(参照渡しにならないので)、やや効率が悪くなるかもしれません。

投稿2015/08/02 11:04

Stripe

総合スコア2183

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

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

退会済みユーザー

退会済みユーザー

2015/08/10 14:55

SwiftにおいてはObjective-CやC言語のようにオブジェクトならヒープ、構造体ならスタックに作られるというわけではありません。classのインスタンスも、structもenumもスタックに作られる場合もあり、ヒープに作られる場合もあります。
Stripe

2015/08/10 18:16

アップルのドキュメントには、以下のように書かれています。 「Reference counting only applies to instances of classes. Structures and enumerations are value types, not reference types, and are not stored and passed by reference.」 ARCはヒープのメモリ管理に使用されます。 実際にSwiftのコードをディスアセンブルしても、classはヒープにstructはスタックに実体があるように見えます。 どのようなコードを書いたら、classのインスタンスをスタックに置くことができますか?
退会済みユーザー

退会済みユーザー

2015/08/15 22:38

classのインスタンスをスタックに置く方法はわかりませんが、structは24バイトを越えるとheapに追い出されます。 struct S1 { let a: UInt64 = 1 let b: UInt64 = 2 } struct S2 { let a: UInt64 = 1 let b: UInt64 = 2 let c: UInt64 = 3 let d: UInt64 = 4 } 上記のS1とS2はそれぞれ異なった方法でメモリにレイアウトされます。
Stripe

2015/08/16 07:38

struct S2 { let a: UInt64 = 1 let b: UInt64 = 2 let c: UInt64 = 3 let d: UInt64 = 4 } func f() { let s2 = S2() println(s2.a) } 上記の関数f()をディスアセンブルすると以下のようになりました。 <+00>: pushq %rbp <+01>: movq %rsp, %rbp <+04>: subq $0x50, %rsp <+08>: leaq -0x20(%rbp), %rdi <+12>: callq 0x1001618b0 ; CommandLineSwift.S2.init <+17>: leaq 0x5ec08(%rip), %rdi <+24>: addq $0x8, %rdi <+31>: leaq -0x48(%rbp), %rax <+35>: movq -0x20(%rbp), %rcx <+39>: movq -0x18(%rbp), %rdx <+43>: movq -0x10(%rbp), %rsi <+47>: movq -0x8(%rbp), %r8 <+51>: movq %rcx, -0x40(%rbp) <+55>: movq %rdx, -0x38(%rbp) <+59>: movq %rsi, -0x30(%rbp) <+63>: movq %r8, -0x28(%rbp) <+67>: movq %rcx, -0x48(%rbp) <+71>: movq %rdi, -0x50(%rbp) <+75>: movq %rax, %rdi <+78>: movq -0x50(%rbp), %rsi <+82>: callq 0x1000ba980 ; Swift.println <+87>: addq $0x50, %rsp <+91>: popq %rbp <+92>: retq 32バイトのstructでも、スタックに置かれていることが分かります。 どんなコードを書いたらstructはヒープに置かれるんですか? また、あたなのSwiftのバージョンはいくつですか?(ちなみに上記の結果はSwift1.2です。) 仮にstructがヒープに置かれた場合、CやObjective-Cとの互換性はどうなりますか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問