もっと、いい方法があれば教えてほしいです。
連続する Modifirer の中で
パディング、マージンの調整に便利かも、
という発想。

視覚的に把握できるの便利。
View Debugger で見るより実はシンプルで速い。
慣れてしまえばどうでもいい話かな。
もっと、いい方法があれば教えてほしいです。
連続する Modifirer の中で
パディング、マージンの調整に便利かも、
という発想。

視覚的に把握できるの便利。
View Debugger で見るより実はシンプルで速い。
慣れてしまえばどうでもいい話かな。
なぜか、
通常プロジェクトと Playground では Auto-Completion が違う。
マルチなクロージャーを含む
Button(action:label:)
を Auto-Completion で生成して、全クロージャー展開しようとするとできない。
せっかく Playgorund で Completion の使い方を掴んだような気がしてたのに!
【Xcode】自動補完 (Auto Completion) の使い方 - trailing closure#SwiftUI #SwiftData #プログラミング初心者 https://t.co/SkjyyJrFgF
— chanzmao (@maochanz) December 19, 2023
クロージャー展開しようとすると以下の感じ。
Playground 側は OK。
// Playground
Button {
code
} label: {
code
}
// Button(action: <#T##() -> Void#>, label: <#T##() -> View#>)
フォーカスの当たったままコピーすると設定記述的なものがテキストで取得できる。
これが、既存プロジェクト側では、なぜか、展開できない。
// Project
Button(action: {}, label: {
Text("Button")
})
// Button(action: /*@START_MENU_TOKEN@*/{}/*@END_MENU_TOKEN@*/, label: {
// /*@START_MENU_TOKEN@*/Text("Button")/*@END_MENU_TOKEN@*/
// })
なんやこれ。
プロジェクト内に同様な記述があると思って探しみたけど見当たらない。
登録されている Completions を
Editor
↓
Show Completions
で確認しても問題はなさそう。

あれこれやっていると、直ることがある。
- Xcode 再起動直後だけ一瞬直る。
- しかし、2回目ぐらいから戻っておかしくなる。
よって、キャッシュか何かを読み込んでいる、と想像。
これでいけた。
rm -rf ~/Library/Developer/Xcode/DerivedData/*
👉 Xcode Quick Fix - Clear Cache
以下でも直ったのかもしれない。
Product
↓
Clean Build Folder...
+
Option

👉 [Xcode][小ネタ] DerivedDataの削除についての備忘録 | DevelopersIO
DerivedData を削除することで効果が出る不具合。
- Build Failed
- ストレージが肥大
- Completion がおかしい
キャッシュのようなもので消しても問題ないらしい。
場所はデフォルトで、
~/Library/Developer/Xcode/DerivedData
で以下メニューから確認できる。
File
↓
{project name} Settings...

少し前に、Xcode をバージョンアップデートしたのでそれが影響しているのかもしれないです。
ぶっちゃけ、この状態でつらい。
公式ドキュメントが見つからなかったので、少しやってみました。
そもそもは、クロージャーをスムーズにに展開したかったので。
いきなり結果です。
説明しづらいので動画です。
一時停止や再生速度を落とすといいかもしれません。
以下、5つだけです。
一般的な操作の順序です。
動画を見ながら確認するといいと思います。
1. 関数の選択 - ↑ ( up ) / ↓ ( down )
2. 関数グループの開閉 - → ( right ) / ← ( left )
3. 関数の決定 - ↩ ( return )
4. フォーカスの移動 - ⇥ ( tab )
5. クロージャーの展開 - ↩ ( return )
あくまで、
- 上下左右のカーソルキー
- タブキー
- リターンキー(エンターキー)
だけで進んでいきます。
その他のキーを押すと、Auto-Completion のモードから外れます。
注意しておくのは、
「青いフォーカス」を意識して選択決定のリターンキー
を押すことだけです。
初心者の、
機能が豊富なIDEの操作の習得はつらい。
👉 [Accepted] SE-0279: Multiple Trailing Closures - Evolution / Announcements - Swift Forums
👉 xcode - Is there a way to simplify typing Swift trailing closure? - Stack Overflow
【Xcode】Auto-Completion がおかしい 不具合の理由 → DerivedData
👉 https://t.co/reCiJzRDDj#swift #プログラミング初心者 pic.twitter.com/OOSGG8VH3d— chanzmao (@maochanz) December 19, 2023

まったく動かない。画面が真っ白。再起動でも同じ。
エラーメッセージ。
SwiftData/ModelContainer.swift:159: Fatal error: failed to find a currently active container for Task
Failed to find any currently loaded container for Task)
コンテナを渡す前に初期化すると問題が解決されるようです。
@main
struct MyApp: App {
let modelContainer: ModelContainer
init() {
do {
modelContainer = try ModelContainer(for: Item.self)
} catch {
fatalError("Could not initialize ModelContainer")
}
}
var body: some Scene {
WindowGroup {
ContentView()
}
.modelContainer(modelContainer)
}
}
👉 SwiftData Fatal error: failed to find a currently active container | Apple Developer Forums
というかんじで、モデルコンテナの初期化位置を最上位にすると直りました。
モデルデータの変更後の整合性の問題でしょうか。
突然動かなくなるのでびっくりします。
利用する View につければ、
struct ContentView: View {
@State private var container = ModelContainer(...)
var body: some Scene {
RecipesList()
.modelContainer(container)
}
}
それ以下では @Environmentを使って問題なく利用できると思っていましたが。
struct RecipesList: View {
@Environment(\.modelContext) private var modelContext
The environment’s modelContext property will be assigned a new context associated with this container. All implicit model context operations in this view, such as Query properties, will use the environment’s context.
Environment ののmodelContext プロパティには、このコンテナに関連付けられた新しいコンテキストが割り当てられます。Query プロパティなど、このビューのすべての暗黙のモデルコンテキスト操作は、Environment のコンテキストを使用します。
👉 modelContainer(_:) | Apple Developer Documentation
Modifier や Preview などあちこちで 生成していると、利用できる範囲が分かりづらくなるのは確か。
【SwiftUI / SwiftData】Using ViewModifier for setting ModelContainer 🔌 #Swift #programminghttps://t.co/UvPcuaHNr8
— chanzmao (@maochanz) December 13, 2023
【Xcode】Preview Crashed で 表示されない 📲 https://t.co/phQLMFTafo #Swift #プログラミング学習
— chanzmao (@maochanz) December 17, 2023
マルチプラットフォームアプリで、
Mac/iPad と iPhone/AppleTV でグループ分けしてそれなりに切り替える。

if prefersTabNavigation { // *
//if UIDevice.current.userInterfaceIdiom == .phone { // NG on macOS
//if UserInterface.prefersTabNavigation {
TabView(selection: $screen) {
ForEach(Screen.allCases) { screen in
screen.destination
.tag(screen as Screen?)
.tabItem { screen.label }
}
}
} else {
NavigationSplitView {
SidebarList(screen: $screen)
} detail: {
DetailColumn(screen: screen)
}
}
判定の条件 (Bool) をどう書くか。
WWDC23 でアナウンスの新機能ですか。
👉 Unleash the UIKit trait system - WWDC23 - Videos - Apple Developer
便利な SwiftUI Environment に UIKit UITrait をブリッジするという UITraitBridgedEnvironmentKey を使った方法。
// Create custom Environment
struct PrefersTabNavigationEnvironmentKey: EnvironmentKey {
static var defaultValue: Bool = false
}
extension EnvironmentValues {
var prefersTabNavigation: Bool {
get { self[PrefersTabNavigationEnvironmentKey.self] }
set { self[PrefersTabNavigationEnvironmentKey.self] = newValue }
}
}
// Bridge UITrait read only
#if os(iOS)
extension PrefersTabNavigationEnvironmentKey: UITraitBridgedEnvironmentKey {
static func read(from traitCollection: UITraitCollection) -> Bool {
return traitCollection.userInterfaceIdiom == .phone || traitCollection.userInterfaceIdiom == .tv
}
static func write(to mutableTraits: inout UIMutableTraits, value: Bool) {
// Do not write
}
}
#endif
@Environment(\.prefersTabNavigation) private var prefersTabNavigation
高級な感じで相互読み書き可能な状態にできるのはいいけども。
なんとなく試しながら書いてみました。
Constants な感じで。書き方はいくつかあるようです。
enum を使う。意見はいろいろありそう。
enum UserInterface { // as namespace
static var prefersTabNavigation: Bool {
#if os(iOS) //canImport(UIKit)
let idiom = UIDevice.current.userInterfaceIdiom
return idiom == .phone || idiom == .tv
#else
return false
#endif
}
}
フツーに struct で書く。
struct UserInterface {
static var prefersTabNavigation: Bool {
#if os(iOS) //canImport(UIKit)
let idiom = UIDevice.current.userInterfaceIdiom
return idiom == .phone || idiom == .tv
#else
return false
#endif
}
}
👉 `static let` in enum vs struct? - Using Swift - Swift Forums
呼び出し側。
if UserInterface.prefersTabNavigation {
#if os(iOS)
ての、なんとなく
なるべくは使いたくないです。
Apple 公式サンプルは、新機能を強引に Read Only でサンプルコードに利用した感じに見えるけどもー。
【SwiftUI】iOS と macOS で互換したいコードの一つの解法
👉 https://t.co/gUgv9B40x7#プログラミング #SwiftUI— chanzmao (@maochanz) May 23, 2024