如何初始化大小为n的数组,其中n是从另一个视图传递?



我从这篇文章中发现,我们可以创建固定大小的数组var array = [String?](repeating: nil, count: 10)

当参数count从不同的视图传入时,我如何做同样的事情?

我有一个primary view,其中用户选择start dateend 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)
}
}

注意,手动添加一个初始化器会阻止自动生成的初始化器被创建,所以你必须手动添加未来的属性到它。

最新更新