我从这篇文章中发现,我们可以创建固定大小的数组var array = [String?](repeating: nil, count: 10)
当参数count
从不同的视图传入时,我如何做同样的事情?
我有一个primary view
,其中用户选择start date
和end date
。我将日期传递给secondary view
。
利用这篇文章中的信息,我想出了如何在两个日期之间得到所有的日子。
我想创建一个状态变量,如@State private var names: [String?](repeating: nil, count: DayCount)
其中DayCount
为总天数。
struct SecondaryView: View {
// loop start and end date are passed from primary view
var loopStartDate = Date()
var loopEndDate = Date()
@State private var dateArray = Date.dates(from: loopStartDate, to: loopEndDate)
// throws cannot use instance member 'loopEndDate' within property initializer;
//property initializers run before 'self' is available
@State private var names = [String?](repeating: nil, count: dateArray.count)
// this throws error `Cannot use instance member 'dateArray' within property
//initializer; property initializers run before 'self' is available`
Swift不允许在self
实例完全初始化之前使用它,所以不允许使用依赖于其他变量的变量(除非它们是惰性的,这需要在初始化后使用它们)。
想象两个变量的初始化相互依赖。没有提供初始化式,应该先初始化哪一个?你会如何解决冲突?在更复杂的情况下,你如何制定一个通用的方法来解决这个问题?
// Imaginary scenario
struct Test {
var first: Int = second + 1
var second: Int = first - 2
}
let test = Test()
print(test.first) // What would this print?
Swift禁止它。你可以在你的初始化器中提出一个初始化策略。
因此,解决方案可能只是添加一个初始化式来处理它:struct SecondaryView: View {
var loopStartDate = Date()
var loopEndDate = Date()
@State private var dateArray: [Date]
@State private var names: [String?]
init() {
dateArray = Date.dates(from: loopStartDate, to: loopEndDate)
names = Array<String?>(repeating: nil, count: dateArray.count)
}
}
注意,手动添加一个初始化器会阻止自动生成的初始化器被创建,所以你必须手动添加未来的属性到它。