আঃ! আপনি খুব কাছাকাছি ছিল। এইভাবে আপনি এটি করেন। আপনি কোনও ডলারের চিহ্ন (বিটা 3) বা আন্ডারস্কোর (বিটা 4) মিস করেছেন, এবং হয় নিজের পরিমাণের সম্পত্তির সামনে নিজেই, অথবা পরিমাণের প্যারামিটারের পরে মূল্য নির্ধারণ করুন। এই সমস্ত বিকল্প কাজ করে:
আপনি দেখতে পাবেন যে আমি @State
অন্তর্ভুক্তডিসিমালগুলি সরিয়েছি , শেষে ব্যাখ্যাটি দেখুন।
এটি সম্পত্তি ব্যবহার করছে (এটির সামনে নিজেকে রাখুন):
struct AmountView : View {
@Binding var amount: Double
private var includeDecimal = false
init(amount: Binding<Double>) {
self._amount = amount
self.includeDecimal = round(self.amount)-self.amount > 0
}
}
অথবা। মূল্য ব্যবহারের পরে (তবে স্ব ছাড়াই, কারণ আপনি পাসের প্যারামিটার ব্যবহার করছেন, কাঠামোর সম্পত্তি নয়):
struct AmountView : View {
@Binding var amount: Double
private var includeDecimal = false
init(amount: Binding<Double>) {
self._amount = amount
self.includeDecimal = round(amount.value)-amount.value > 0
}
}
এটি একই, তবে আমরা প্যারামিটার (উইমাউন্ট) এবং সম্পত্তি (পরিমাণ) এর জন্য আলাদা আলাদা নাম ব্যবহার করি, সুতরাং আপনি প্রতিটি ব্যবহার করার সময় আপনি স্পষ্ট দেখতে পাবেন।
struct AmountView : View {
@Binding var amount: Double
private var includeDecimal = false
init(withAmount: Binding<Double>) {
self._amount = withAmount
self.includeDecimal = round(self.amount)-self.amount > 0
}
}
struct AmountView : View {
@Binding var amount: Double
private var includeDecimal = false
init(withAmount: Binding<Double>) {
self._amount = withAmount
self.includeDecimal = round(withAmount.value)-withAmount.value > 0
}
}
নোট করুন যে সম্পত্তিটির সাথে মূল্য মূল্য প্রয়োজন হয় না, সম্পত্তি র্যাপারকে (@ বাঁধাই করা) ধন্যবাদ, যা এমন অ্যাকসেসর তৈরি করে যা। মূল্যকে অযৌক্তিক করে তোলে। যাইহোক, প্যারামিটারের সাথে, এমন কোনও জিনিস নেই এবং আপনাকে এটি স্পষ্টভাবে করতে হবে। আপনি যদি সম্পত্তির মোড়ক সম্পর্কে আরও জানতে চান, ডাব্লুডাব্লুডিসি সেশন 415 - আধুনিক সুইফট এপিআই ডিজাইনটি পরীক্ষা করুন এবং 23:12 এ যান।
যেমন আপনি আবিষ্কার করেছেন, ইনিমিলাইজার থেকে @ স্টেট ভেরিয়েবলটি পরিবর্তন করা নীচের ত্রুটিটি ফেলে দেবে: থ্রেড 1: মারাত্মক ত্রুটি: ভিউ.বডি বাইরে স্টেট অ্যাক্সেস করা । এটি এড়াতে আপনার উচিত হয় @ স্টেটটি সরানো উচিত। যা উপলব্ধি করে কারণ অন্তর্ভুক্তডিসিমাল সত্যের উত্স নয়। এর মান পরিমাণ থেকে প্রাপ্ত। @ স্টেট অপসারণ করে তবে includeDecimal
পরিমাণ পরিবর্তন হলে আপডেট হবে না। এটি অর্জন করার জন্য, সর্বোত্তম বিকল্পটি হ'ল আপনার অন্তর্ভুক্তডিসিমালকে একটি গণিত সম্পত্তি হিসাবে সংজ্ঞায়িত করা, যাতে এর মান সত্যের পরিমাণ (পরিমাণ) থেকে প্রাপ্ত হয়। এইভাবে, যখনই পরিমাণ পরিবর্তন হয়, আপনার অন্তর্ভুক্তডিসিমালও তা করে। যদি আপনার দৃষ্টিভঙ্গি অন্তর্ভুক্ত ডেসিমেলের উপর নির্ভর করে তবে এটি পরিবর্তিত হওয়ার সাথে সাথে এটি আপডেট করা উচিত:
struct AmountView : View {
@Binding var amount: Double
private var includeDecimal: Bool {
return round(amount)-amount > 0
}
init(withAmount: Binding<Double>) {
self.$amount = withAmount
}
var body: some View { ... }
}
রব মায়োফ দ্বারা নির্দেশিত হিসাবে , আপনি স্টেট ভেরিয়েবল শুরু করতে $$varName
(বিটা 3), বা _varName
( বিটা 4 ) ও ব্যবহার করতে পারেন :
$$includeDecimal = State(initialValue: (round(amount.value) - amount.value) != 0)
_includeDecimal = State(initialValue: (round(amount.value) - amount.value) != 0)
self.includeDecimal = round(self.amount)-self.amount > 0
Thread 1: Fatal error: Accessing State<Bool> outside View.body