Swift:保持方法内参数,同时将其作为变量传递



我有一个基于neil的答案的自定义视图,它有两个级别:MainContentSubviewContent,都是Views。
用户可以从单个MainContent导航到许多SubviewContent。这意味着我动态地创建目标视图的内容。

层次结构如下:

struct StackNavigationView<MainContent, SubviewContent>: View where MainContent: View, SubviewContent: View {
subView: () -> SubviewContent
//...
}
struct SomeView: View {
var body: some View {
StackNavigationView(/*init parameters*/) {
//MainView
}
}
private func  subView(forIndex index: Int) -> AnyView {
//some stuff...
}
}

SubviewContent是从MainContent传递的方法构建的,并作为变量存储,如下所示:

let subView: () -> SubviewContent

在初始化过程中,我传递了一个@escaping方法并将其赋值给变量subView

init(@ViewBuilder subView: @escaping () -> SubviewContent, /*more stuff*/) {
self.subView = subView
//more stuff...
}

该方法基于索引返回视图,如下所示:

private func subView(forIndex index: Int) -> AnyView {
switch index {
case 0: return AnyView(/*some content*/)
case 1: return AnyView(/*some content*/)
//etc...
default: return AnyView(ViewNotFound())
}
}
问题是,如果我传递一个需要参数的视图,参数必须是硬编码的. 否则参数为nil,应用程序崩溃。

带参数的例子:

case 1: return AnyView( DestinationView(parameter: some_parameter) )

当用户尝试导航时,这会崩溃,因为some_parameternil
同样的问题出现在optional参数中。当打开包装时,它们是nil

我已经尝试删除@escaping位来解决这个问题,但随后应用程序立即崩溃,因为没有参数可以传递(再次,它通过nil,但出于不同的原因,显然)。


如何传递一个完全构造的View只有在用户选择了导航目的地之后?

更新1

经过对问题的回顾和讨论,我认为更好的方法是:

如何在传递方法作为变量的同时维护方法内参数?

如果你只是想传递imageppaths/text,也许只是让子视图直接从其他地方读取它?

Class ParamsToPass {
static var data = [
"viewID" : [
["param1key": "param1value"]
["param2key": "param2value"]
]
]
} 

关于你的更新:

如何在传递方法作为变量的同时维护方法内参数?

也许让方法返回你需要的参数?

最新更新