【问题标题】:Xcode Swift pass closure as parameter on init()Xcode Swift 将闭包作为参数传递给 init()
【发布时间】:2022-01-16 14:55:04
【问题描述】:

我想在初始化时将 Closure 作为参数传递,就像 Kotlin 块传递一样。 但是“变量'self.calendarView'在被初始化之前被闭包捕获”发生了。 怎么解决..?

struct ContentView: View {
    let calendarView : MyDateCalendarView
    func turnOnDailyPlanView(_ dateString : String){
        print(dateString)
    }
    init(){
        calendarView = MyDateCalendarView(year: 2021, month: 10)
        {
            (str : String) -> Void in
            turnOnDailyPlanView(str)
        }
    }
}

【问题讨论】:

  • 将您的 calendarView 声明为 Optionals。例如:- let calendarView : MyDateCalendarView?let calendarView : MyDateCalendarView? = nil 甚至 let calendarView : MyDateCalendarView!

标签: ios swift xcode


【解决方案1】:

在实例初始化之前,您不能使用实例方法。

一种解决方案是使用隐式展开的可选项……

private(set) var calendarView: MyDateCalendarView!

init() {
  calendarView = MyDateCalendarView(
    year: 2021,
    month: 10,
    whateverTheClosureIsCalled: turnOnDailyPlanView
  )
}

……但是你需要那个吗?您的方法不使用任何实例信息。它可能是静态的。

static func turnOnDailyPlanView(_ dateString: String) {
  print(dateString)
}
  
init() {
  calendarView = MyDateCalendarView(
    year: 2021,
    month: 10,
    whateverTheClosureIsCalled: Self.turnOnDailyPlanView
  )
}

【讨论】:

  • 谢谢!我将视图结构设为可选类型。该函数将做更多关于修改视图设计的操作。
猜你喜欢
  • 1970-01-01
  • 2021-10-20
  • 1970-01-01
  • 2017-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-20
  • 1970-01-01
相关资源
最近更新 更多