更新:この方法は、実際のプロジェクトでは使用しない目標を学習するためだけのものです!(新しい更新まで)
ここでは、State変数をAny
型として定義する際に2つの問題が発生します。ご存知のように、初期化する必要があります。たとえば、このコードでは、State変数をImageで初期化する必要がありますが、これは望ましくありません。タイプとして任意を選択することのすべてのポイントは、タイプをフィードする自由でしたが、Stateは、初期化することでこの自由を奪い、チェリーオントップ、Stateを使用可能にするには、強制的にアンラッピングする必要があります。
したがって、Stateを使用したvar type anyに関するこの2つの問題(初期化+強制アンラップ)で、これらの問題を解決する方法はありますか?
@State var anyItem: Any = UIImage(named: "apple")!
ここにマスターの助けを借りたコードの私の新しいアップデート:
import SwiftUI
struct ContentView: View
{
@State var anyItem: Any?
@State var changedType: Bool = false
init() {
_anyItem = .init(initialValue: UIImage(named: "Apple"))
}
var body: some View {
if changedType == false
{
Image(uiImage: anyItem as! UIImage)
}
else
{
Text(anyItem as! String)
}
Text("Test")
.onTapGesture
{
chandType.toggle()
anyItem = "anyItem changed to Text! Kaboom!"
}
}
}
問題はのせいではありませんAny
。これは、次の行が原因です。
UIImage(named: "apple")
オプションの(UIImage?
)を返します。
anyItem
タイプの値を受け入れたい場合はUIImage?
、それを作成する必要がありますAny?
。
@State var anyItem: Any? = UIImage(named: "apple")
または、オプションのデフォルト値を指定します。
@State var anyItem: Any = UIImage(named: "apple") ?? UIImage()
anyItem
さまざまなタイプで初期化する方法の例を次に示します(これはデモ用であり、実際のアプリケーションでは使用しないでください)。
struct ContentView: View {
@State var anyItem: Any?
init() {
_anyItem = .init(initialValue: UIImage(named: "apple"))
}
var body: some View {
Text("Test")
.onAppear {
anyItem = "test"
}
}
}
しかし、Asperiがすでに示唆しているように、それは良い考えではなく、一般的Any
にSwiftUIでの使用は避けたいと考えています。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加