Argh! Çok yakındın. Bunu nasıl yapıyorsun. Bir dolar işaretini (beta 3) veya alt çizgiyi (beta 4) ve miktar mülkünüzün önünde kendinizi veya miktar parametresinden sonraki .value'yu kaçırdınız. Tüm bu seçenekler çalışır:
@State
İncludeDecimal 'i kaldırdığımı göreceksiniz , sondaki açıklamayı kontrol edin.
Bu mülkü kullanmaktır (önüne kendini koyun):
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
}
}
veya sonra .value kullanarak (ancak self olmadan, çünkü yapının özelliğini değil, iletilen parametreyi kullanıyorsunuz):
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
}
}
Bu aynıdır, ancak parametre (withAmount) ve özellik (miktar) için farklı isimler kullanıyoruz, böylece her birini ne zaman kullandığınızı açıkça görebilirsiniz.
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 değerini gereksiz kılan erişimcileri oluşturan özellik sarmalayıcı (@Binding) sayesinde, özellikte .value gerekli değildir. Ancak, parametre ile böyle bir şey yoktur ve bunu açıkça yapmanız gerekir. Mülk sarmalayıcılar hakkında daha fazla bilgi edinmek isterseniz WWDC oturumu 415 - Modern Swift API Tasarımı'na bakın ve 23: 12'ye atlayın.
Keşfettiğin gibi, başlatıcıdan @State değişkenini değiştirmek aşağıdaki hatayı oluşturacak: Thread 1: Önemli hata: View.body dışında State'e erişiliyor . Bundan kaçınmak için, @State'i kaldırmalısınız. Bu mantıklıdır çünkü includeDecimal bir gerçek kaynağı değildir. Değeri miktardan türetilir. Ancak @ State kaldırıldığında, includeDecimal
miktar değişirse güncellenmez. Bunu başarmak için en iyi seçenek, includeDecimal'inizi hesaplanmış bir özellik olarak tanımlamaktır, böylece değeri doğruluk kaynağından (miktar) türetilir. Bu şekilde, miktar değiştiğinde, includeDecimal değeriniz de değişir. Görünümünüz includeDecimal'e bağlıysa değiştiğinde güncellenmelidir:
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 tarafından belirtildiği gibi, bir Durum değişkenini başlatmak için $$varName
(beta 3) veya _varName
(beta4) da kullanabilirsiniz :
$$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
aitThread 1: Fatal error: Accessing State<Bool> outside View.body