মার্টিন বলেছেন , যদি আপনি ডকুমেন্টেশন তাকান VStack
এর init(alignment:spacing:content:)
, আপনি দেখতে পারেন যে content:
পরামিতি অ্যাট্রিবিউট হয়েছে @ViewBuilder
:
init(alignment: HorizontalAlignment = .center, spacing: Length? = nil,
@ViewBuilder content: () -> Content)
এই বৈশিষ্ট্যটি ViewBuilder
প্রকারটিকে বোঝায় , যদি আপনি উত্পন্ন ইন্টারফেসটি দেখে থাকেন তবে মনে হচ্ছে:
@_functionBuilder public struct ViewBuilder {
public static func buildBlock() -> EmptyView
public static func buildBlock(_ content: Content) -> Content
where Content : View
}
@_functionBuilder
অ্যাট্রিবিউট "বলা একটি বেসরকারী বৈশিষ্ট্যের একটি অংশ ফাংশন বিল্ডার ", যা হয়েছে এখানে সুইফট বিবর্তনে গল্পটা , এবং সুইফট এর যে সংস্করণটি Xcode 11 জাহাজ, এটা SwiftUI ব্যবহার করা যেতে সক্ষম হবেন জন্য বিশেষভাবে বাস্তবায়িত।
কোনও ধরণের চিহ্ন @_functionBuilder
চিহ্নিতকরণ এটিকে বিভিন্ন ঘোষণাপত্র যেমন ফাংশন, গণিত বৈশিষ্ট্য এবং এই ক্ষেত্রে ফাংশন ধরণের পরামিতিগুলির হিসাবে কাস্টম অ্যাট্রিবিউট হিসাবে ব্যবহার করার অনুমতি দেয়। এ জাতীয় এনোটোটেড ঘোষণাগুলি কোডের ব্লকগুলিকে রূপান্তর করতে ফাংশন নির্মাতা ব্যবহার করে:
- বর্ণিত ফাংশনগুলির জন্য, কোডটির যে ব্লকটি রূপান্তরিত হয় তা হ'ল বাস্তবায়ন।
- টীকায়িত গণিত বৈশিষ্ট্যের জন্য, কোডটির যে ব্লকটি রূপান্তরিত হয় তা হ'ল গ্রাহক।
- ফাংশন প্রকারের টীকাকৃত প্যারামিটারগুলির জন্য, কোডের ব্লকটি রূপান্তরিত হয় যে কোনও ক্লোজার এক্সপ্রেশন যা এটিতে পাস (যদি থাকে)।
কোনও ফাংশন নির্মাতা কোডকে যেভাবে রূপান্তর করে তার বিল্ডার পদ্ধতির প্রয়োগের মাধ্যমে এটি সংজ্ঞায়িত করা হয় যেমন buildBlock
অভিব্যক্তিগুলির একটি সেট নেয় এবং সেগুলি একক মানে সংহত করে।
উদাহরণস্বরূপ, এক থেকে একাধিক ভিউ একত্রিত করে 1 থেকে 10 অনুসারে মাপসই পরামিতিগুলির জন্য ViewBuilder
প্রয়োগসমূহ :buildBlock
View
TupleView
@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *)
extension ViewBuilder {
public static func buildBlock<Content>(_ content: Content)
-> Content where Content : View
public static func buildBlock<C0, C1>(_ c0: C0, _ c1: C1)
-> TupleView<(C0, C1)> where C0 : View, C1 : View
public static func buildBlock<C0, C1, C2>(_ c0: C0, _ c1: C1, _ c2: C2)
-> TupleView<(C0, C1, C2)> where C0 : View, C1 : View, C2 : View
}
এটি VStack
প্রারম্ভকালের পাসের মধ্যে একটি ক্লোর মধ্যে ভিউ এক্সপ্রেশনগুলির একটি সেটকে buildBlock
একই সংখ্যার আর্গুমেন্ট গ্রহণ করে এমন একটি কলকে রূপান্তরিত করতে দেয়। উদাহরণ স্বরূপ:
struct ContentView : View {
var body: some View {
VStack(alignment: .leading) {
Text("Hello, World")
Text("Hello World!")
}
}
}
একটি কল এ রূপান্তরিত হয় buildBlock(_:_:)
:
struct ContentView : View {
var body: some View {
VStack(alignment: .leading) {
ViewBuilder.buildBlock(Text("Hello, World"), Text("Hello World!"))
}
}
}
অস্বচ্ছ ফলাফলের ফলে some View
সন্তুষ্ট হওয়ার ফলেTupleView<(Text, Text)>
।
আপনি নোট করবেন যে ViewBuilder
কেবলমাত্র buildBlock
10 টি প্যারামিটার পর্যন্ত সংজ্ঞায়িত করা হয়েছে, তাই যদি আমরা 11 টির মতামত সংজ্ঞায়িত করার চেষ্টা করি:
var body: some View {
VStack(alignment: .leading) {
Text("Hello, World")
Text("Hello World!")
Text("Hello World!")
Text("Hello World!")
Text("Hello World!")
Text("Hello World!")
Text("Hello World!")
Text("Hello World!")
Text("Hello World!")
Text("Hello World!")
Text("Hello World!")
}
}
আমরা একটি সংকলক ত্রুটি পেয়েছি, যেহেতু কোডের এই ব্লকটিকে পরিচালনা করার জন্য কোনও বিল্ডার পদ্ধতি নেই (দ্রষ্টব্য যে এই বৈশিষ্ট্যটি এখনও একটি কার্য-অগ্রগতি হিসাবে রয়েছে, চারপাশের ত্রুটি বার্তাগুলি তেমন সহায়ক হবে না)।
বাস্তবে, আমি বিশ্বাস করি না যে লোকেরা প্রায়শই এই বিধিনিষেধের মধ্যে চলে আসবে, উদাহরণস্বরূপ উপরের উদাহরণটি ForEach
পরিবর্তে ভিউ ব্যবহার করে আরও ভাল পরিবেশিত হবে:
var body: some View {
VStack(alignment: .leading) {
ForEach(0 ..< 20) { i in
Text("Hello world \(i)")
}
}
}
তবে আপনার যদি 10 টিরও বেশি স্থিতিযুক্ত সংজ্ঞায়িত ভিউগুলির প্রয়োজন হয় তবে আপনি সহজেই এই Group
ভিউটি ব্যবহার করে এই বিধিনিষেধটি কার্যকর করতে পারেন :
var body: some View {
VStack(alignment: .leading) {
Group {
Text("Hello world")
}
Group {
Text("Hello world")
}
}
ViewBuilder
এছাড়াও অন্যান্য ফাংশন বিল্ডার পদ্ধতিগুলি প্রয়োগ করে:
extension ViewBuilder {
public static func buildEither<TrueContent, FalseContent>(first: TrueContent)
-> ConditionalContent<TrueContent, FalseContent>
where TrueContent : View, FalseContent : View
public static func buildEither<TrueContent, FalseContent>(second: FalseContent)
-> ConditionalContent<TrueContent, FalseContent>
where TrueContent : View, FalseContent : View
}
এটি এটি বিবৃতিগুলি পরিচালনা করার ক্ষমতা দেয়:
var body: some View {
VStack(alignment: .leading) {
if .random() {
Text("Hello World!")
} else {
Text("Goodbye World!")
}
Text("Something else")
}
}
যা রূপান্তরিত হয়:
var body: some View {
VStack(alignment: .leading) {
ViewBuilder.buildBlock(
.random() ? ViewBuilder.buildEither(first: Text("Hello World!"))
: ViewBuilder.buildEither(second: Text("Goodbye World!")),
Text("Something else")
)
}
}
(নির্লজ্জ 1-আর্গুমেন্ট নির্গমন করে ViewBuilder.buildBlock
স্পষ্টতার জন্য)।
@ViewBuilder
developer.apple.com/documentation/swiftui/viewbuilder ।