状態変化を監視する変数は body View の上で宣言する
body内で宣言すると状態変化しない(状態変化する時にViewを表示し直すため)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
struct test: View { @State var aaa = 0 //OK var body: some View { @State var bbb = 0 //NG Button(action: { aaa += 1 bbb += 1 }) { Text("\(String(aaa))") } Text("\(String(bbb)") } } |
id: \.self
ForEachでコレクションを一つずつ取り出して処理する時にviewのidに第一引数と同じものを与える?
このForEachの\.selfで動的に複数のListViewを作った場合挙動がおかしくなる。その場合はUUIDで構成したIDを割り当てる。
参考記事: https://zenn.dev/kntk/articles/1f1b40da6fe181
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
let aaa: [String] = ["a", "b", "c"] ForEach(aaa, id: \.self){ bbb in Text("\(bbb)") } //テキストが a b c で作成されると同時にtextのidもa b cに振られる? //動的にList等のViewを作成する時は下のようなUUID構造体でIDに割り振らないと動作がおかしくなる struct aaa: Identifiable{ var id = UUID() //変数名は id のみ有効 var bbb: String } struct ContentView: View{ @State var ccc: [aaa] = [aaa(bbb: "あああ"), aaa(bbb: "いいい"), bbb(ccc: "ううう")] var body: some View { List{ ForEach (ccc) { a in Button(action: { }){ Text(a.bbb) } } } } } |
構造体、クラスの違い
構造体はインスタンス化せず使える値型
クラスはインスタンス化しないと使えない参照型
viewのカスタマイズは三項演算子で行う
SwiftUIのif文はオブジェクトを一度インスタンス化してから分けるのでその分処理が無駄になる
プロトコルとは
C++とかの抽象クラス的な機能
Listの背景色modifierについて
List内の背景色はすこし特殊で本体部と個別Viewを設置する【行】の背景色とで別れていて記述も通常と少し違う
文字色は通常通りの設定で可能
1 2 3 4 5 6 |
List { Text("あああ") .listRowBackground(Color.blue) //Textの行の背景色 } .scrollContentBackground(.hidden) //一度本体部を透明にする .background(Color.gray) //透明にしてから色を設定する |

Viewに変数を渡した時の#Previewの書き方について
初期化時にプロパティを渡す子ビューのプレビューを作成するには、#Preview
マクロの中で、そのビューのイニシャライザ(init
)に必要な引数を指定します。
基本的な書き方
たとえば、TestView
がmessage: String
というプロパティを持っている場合、プレビューは以下のように書きます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import SwiftUI struct TestView: View { let message: String // 初期化時に必須のプロパティ var body: some View { Text(message) } } #Preview { // プレビューの中で、TestViewの初期化子に必要な引数を指定する TestView(message: "プレビュー用のメッセージ") } |
#Preview
マクロのブロックの中は、ビューを返すクロージャとして扱われます。このため、TestView()
のように引数を省略して呼び出すことはできず、TestView(message: "...")
のように正しい引数を渡す必要があります。
複数のプレビューを作成する場合
さまざまな状態をテストするために、複数のプレビューを定義することもできます。
1 2 3 4 5 6 7 |
#Preview("通常") { TestView(message: "通常メッセージ") } #Preview("長いメッセージ") { TestView(message: "これは非常に長いメッセージです。テキストの折り返しを確認します。") } |
プレビューでダミーデータを使用する場合
プレビュー専用のダミーデータ(MockData
など)を作成しておくと、より柔軟なプレビューが可能になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
import SwiftUI struct User { var name: String } struct UserView: View { let user: User var body: some View { VStack(alignment: .leading) { Text("ユーザー名:") Text(user.name).font(.headline) } } } // プレビュー用のダミーデータ let mockUser = User(name: "テストユーザー") #Preview { UserView(user: mockUser) } |
つまりプレビュー用に変数名の右は何でも良いから書いておけばおk
if文の後に【 , 】で && の代わりになる
Swift特有の文法 guard let でよく使われるらしい。
1 2 3 4 5 6 7 |
if let data = try KeychainHelper.read(service: service, account: account), let saved = try? JSONDecoder().decode(SavedToken.self, from: data), saved.expiry > Date() { self.token = saved.token self.expiry = saved.expiry return saved.token } |
コメント