私たちは、この例では、5.1の新機能は、中SwiftUIに研究されてきたスウィフトを見て、次で始まる:some
SwiftUIとスウィフト5.1新機能(1)不透明不透明な戻り値の型結果の型、など@State
と@Binding
背後@propertyDelegate
SwiftUIとスウィフト5.1の新機能(2)のプロパティ代表者エージェントプロパティ、および@dynamicMemberLookup
SwiftUIとスウィフト5.1の新機能(3)キーのパスメンバー検索
struct SlideViewer: View {
@State private var isEditing = false
@Binding var slide: Slide
var body: some View {
VStack {
Text("Slide #\(slide.number)")
if isEditing {
TextFiled($slide.title)
}
}
}
}
复制代码
我々は最終的に含まれる最後の重要な特性SwiftUIに来た:FunctionBuilder、理由の面で最後の1を入れていることは、これまでのところ、まだAppleのWWDCをキャッチするためには、言語機能スウィフト進化審査に合格していないですので、 19ポイントを時間内に、したがってまだスポットを扱うので、この記事で説明した内容は、将来変更される可能性がありますが、原因のiOS 13の差し迫ったリリースに、車輪の再発明べきではありません。
1. SwiftUIのDSLのニーズ
我々は慎重に上記のDSLコードの構文を解析する必要があります。
- 可能な不要なカンマ、復帰、ブラケットなど:式から退化。
- このような制御文場合は、シンプルなロジック制御をサポートしています。
- 強く型付けされた:
some View
ビューが変更されたときに、強く型付けされたヘルプの複合ビューの差分の最適化を行い、強く型付けされたの合成を表しています。 - スウィフトの構文を既存と競合しません。
ViewBuilderによって@_functionBuilder理解する2。
同様に@propertyDelegate
変更するために使用するState
、同じ@_functionBuilder
飾るために使用されViewBuilder
、また、存在しないViewBuilder
、それを使用しますコンパイラが、何も、それが含まれている方法のための要件の特定の種類があります。だから、ViewBuilder
それがどこにあるのでしょうか?実際には、容器への各種パラメータの最終的な閉鎖VStack
の例:
// 定义
struct VStack<Content> where Content : View {
init(alignment: HorizontalAlignment = .center, spacing: Length? = nil,
@ViewBuilder content: () -> Content)
}
// 使用
struct ContentView : View {
var body: some View {
VStack(alignment: .leading) {
Text("Hello, World")
Text("Leon Lu")
}
}
}
复制代码
上記の例では、タイルSwiftUI特性が一つの容器の種類に含むかを確認することができ、閉鎖関数定義、我々は、修飾ViewBuidlerを参照します。これはそれを行う方法で、コンパイルできるようにするために、コンパイル時にコードの閉鎖のためのViewBuidlerは「手足を動かす」、推測することは困難ではないでしょうか?の主要な方法のViewBuilderビュー:
static func buildBlock() -> EmptyView
static func buildBlock<Content>(Content) -> Content
static func buildBlock<C0, C1>(C0, C1) -> TupleView<(C0, C1)>
static func buildBlock<C0, C1, C2>(C0, C1, C2) -> TupleView<(C0, C1, C2)>
static func buildBlock<C0, C1, C2, C3>(C0, C1, C2, C3) -> TupleView<(C0, C1, C2, C3)>
static func buildBlock<C0, C1, C2, C3, C4>(C0, C1, C2, C3, C4) -> TupleView<(C0, C1, C2, C3, C4)>
...
复制代码
我々の2つのText
実施例を用いて、自動的にコンパイラ(慣例により名前)static func buildBlock<C0, C1>(C0, C1) -> TupleView<(C0, C1)>
メソッドは、この時間は、VStack
のようなものになりましたVStack<TupleView<(Text,Text)>>
。後ViewBuilder
の変換コード:
struct ContentView : View {
var body: some View {
VStack(alignment: .leading) {
ViewBuilder.buildBlock(Text("Hello, World"), Text("Leon Lu"))
}
}
}
复制代码
のために、あることを言及する価値があるbuildBlock
ほとんどのパラメータのジェネリック版の過負荷が10です。だから、10以上のときに使用することができたときにGroup
、パッケージも、サイクルを拡張することができますが存在する場合は、使用することができますForEach
。
3. FunctionBuilderケース分岐条件
ViewBuilder
機能の2種類がありますが時に分岐条件を含む構築するために使用されます
static func buildEither<TrueContent, FalseContent>(first: TrueContent) ->
ConditionalContent<TrueContent, FalseContent>
static func buildEither<TrueContent, FalseContent>(second: FalseContent) ->
ConditionalContent<TrueContent, FalseContent>
复制代码
別の基準に基づいて返さ異なるビュー場合、そのタイプは、生成された二つのタイプに含まれています。
struct SlideViewer: View {
@State private var isEditing = false
@Binding var slide: Slide
var body: some View {
VStack {
Text("Slide #\(slide.number)")
if isEditing {
TextFiled($slide.title)
} else {
Text(slide.title)
}
}
}
}
复制代码
この場合、VStack
タイプはなりVStack<TupleView<(Text, ConditionalContent<TextField,Text>)>>
エピローグ
命名から@_functionBuilder
含まれているを見ることができる、機能だけでなく、いくつかの微調整ビルダーの可能性を強調し、そしてはいどのような機能ビルダを導入するプラグマティズムのViewBuilderの視点にしたがって、テキスト。
必要に応じてSwiftUIとスウィフト5.1新機能シリーズは、これまで一時的に段落、更新および補足していきます。
、将来的にあなたをもたらすために多くの記事があるだろう、愛をありがとう、あなたがそれを好き願っています。
関連記事:
スウィフト5.1 SwiftUIと新機能(1)不透明不透明な結果タイプ戻り値の型
SwiftUIとスウィフト(2)プロパティブローカープロパティ代議員5.1の新機能
SwiftUIとスウィフト5.1の新機能(3)キーのパスメンバー検索
「インタビュアーキン」を懸念し、次Fanger魏コードをスキャンします
ます。https://juejin.im/post/5d0b2fa45188252e2e078170で再現