อ๊าก! คุณอยู่ใกล้มาก นี่คือวิธีที่คุณทำ คุณพลาดเครื่องหมายดอลลาร์ (เบต้า 3) หรือขีดล่าง (เบต้า 4) และตัวเองอยู่หน้าคุณสมบัติจำนวนเงินของคุณหรือ. ค่าหลังพารามิเตอร์จำนวน ตัวเลือกเหล่านี้ใช้ได้ผล:
คุณจะเห็นว่าฉันลบ@State
ใน includeDecimal ตรวจสอบคำอธิบายในตอนท้าย
นี่คือการใช้คุณสมบัติ (ใส่ตัวเองไว้ข้างหน้า):
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
}
}
หรือใช้. value หลัง (แต่ไม่มีตัวเองเนื่องจากคุณกำลังใช้พารามิเตอร์ที่ผ่านไม่ใช่คุณสมบัติของโครงสร้าง)
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
}
}
สิ่งนี้เหมือนกัน แต่เราใช้ชื่อที่แตกต่างกันสำหรับพารามิเตอร์ (withAmount) และคุณสมบัติ (จำนวน) ดังนั้นคุณจึงเห็นได้ชัดเจนเมื่อคุณใช้แต่ละรายการ
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
}
}
โปรดทราบว่าคุณสมบัตินี้ไม่จำเป็นต้องใช้. value เนื่องจาก property wrapper (@Binding) ซึ่งสร้างตัวเข้าถึงที่ทำให้. value ไม่จำเป็น อย่างไรก็ตามด้วยพารามิเตอร์ไม่มีสิ่งนั้นและคุณต้องทำอย่างชัดเจน หากคุณต้องการเรียนรู้เพิ่มเติมเกี่ยวกับตัวปิดคุณสมบัติให้ตรวจสอบเซสชัน WWDC 415 - Modern Swift API Designแล้วข้ามไปที่ 23:12
ในขณะที่คุณค้นพบการปรับเปลี่ยนตัวแปร @State จาก initilizer จะโยนความผิดพลาดต่อไปนี้: กระทู้ที่ 1: ข้อผิดพลาดร้ายแรง: รัฐเข้าถึงนอก View.body เพื่อหลีกเลี่ยงปัญหานี้คุณควรลบ @State ซึ่งสมเหตุสมผลเพราะ includeDecimal ไม่ใช่แหล่งที่มาของความจริง มูลค่าได้มาจากจำนวนเงิน อย่างไรก็ตามการลบ @State includeDecimal
จะไม่อัปเดตหากจำนวนเงินเปลี่ยนแปลง เพื่อให้บรรลุสิ่งนั้นตัวเลือกที่ดีที่สุดคือการกำหนด includeDecimal ของคุณเป็นคุณสมบัติที่คำนวณได้เพื่อให้ค่าของมันได้มาจากแหล่งที่มาของความจริง (จำนวน) ด้วยวิธีนี้เมื่อใดก็ตามที่จำนวนเงินเปลี่ยนแปลง includeDecimal ของคุณก็เช่นกัน หากมุมมองของคุณขึ้นอยู่กับ 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 { ... }
}
ตามที่ระบุโดยrob mayoffคุณยังสามารถใช้$$varName
(beta 3) หรือ_varName
(beta4) เพื่อเริ่มต้นตัวแปรสถานะ:
$$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