[英]Returning Array from Function (Swift)
这是我的第一个问题,请保持温柔!
我一直在调试我的代码并搜索 stackexchange.com 一段时间,据我所知,我的问题与从 function 返回数组有关。我可以向你保证这不是家庭作业问题,并且我试过通过 Stackoverflow 寻找解决方案,但我已经束手无策了!
ActiveModelResponseList
用于向用户显示可接受的响应列表,以List
形式排列:
struct ActiveModelResponseList: View {
var activeModel: ActiveModel
var body: some View {
List(activeModel.validResponses()) { /* XCode error: "Cannot convert value of type
'[ValidResponse]' to expected
argument type 'Range<Int>'" */
HStack { /* XCode error: "Contextual closure type '() -> TupleView<(Text, Text, Spacer)>'
expects 0 arguments, but 1 was used in closure body" */
Text($0.response)
Text($0.narrative)
Spacer()
}.padding(10)
}
}
}
我已经尝试了多种不同的方法来重构上面的body
,特别是activeModel.validResponses()
导致了错误。 如果我删除它并用硬编码值填充列表,它就可以正常工作。
即function, activeModel.validResponses()
来自ActiveModel
class,如下:
class ActiveModel {
var baseModel: ModelData
private var responses: [Int]
private var activeElement: Int
// Although forThisElement is unused in the base function, ActiveModel still has
// such an element, used for other purposes
public func validResponses() -> [ValidResponse] {
return (baseModel.validResponses(forThisElement: activeElement))
}
}
反过来,这来自基础 class, ModelData
。 请注意, forThisElement
实际上并不是这个 function 所必需的,但包含在内是为了保持多态性(即其他模型将使用它)。 如您所见, ModelData.validResponses
返回一个[ValidResponse]
class ModelData: Hashable, Codable, Identifiable {
var id: Int
var valid_response: [String]
var valid_response_narrative: [String]
public func validResponses(forThisElement: Int) -> [ValidResponse] {
// forThisElement is currently an unused input variable,
// but is required for compatibility with other classes
var thisResult: [ValidResponse] = []
for thisResponse in 0..<valid_response.count {
thisResult[thisResponse].id = thisResponse
thisResult[thisResponse].response = valid_response[thisResponse]
thisResult[thisResponse].narrative = valid_response_narrative[thisResponse]
}
return thisResult
}
}
ValidResponse
只是一个普通的结构体,定义如下:
struct ValidResponse: Identifiable, Hashable {
var id: Int = 0
var response: String = "0"
var narrative: String = "Default"
}
正在为 iPod touch(第 7 代)生成预览,我正在使用 Xcode 版本 13.1 (13A1030d),并在 2015 年年中的 MacBook Pro 上使用 MacOS 12.0.1 进行编译。
我在 stackexchange 上找到了以下答案,但在阅读它们之后我觉得并没有变得更明智(而且,由于这些答案已经过时,我想知道它们是否仍然相关):
谁能提供任何指导?
第一条错误消息是无稽之谈。 修复第二个,它将消失。
您的问题的标题与您的实际问题无关,即您正在尝试使用外部闭包中的位置参数。 那是行不通的; 他们不能那样传播。 每个新的闭包 scope 都有自己的一组位置参数,并且HStack.init
不使用任何参数,正如错误告诉你的那样。
修复:命名参数。
List(activeModel.validResponses()) { response in
HStack {
Text(response.response)
Text(response.narrative)
@Jessy,澄清一下,我尝试进行以下更改,但它也没有奏效:
struct ActiveModelResponseList: View {
var activeModel: ActiveModel
var validResponses: [ValidResponse] = []
var body: some View {
let someResp = activeModel.validResponses()
List {
Text("\(someResp.count)")
}
}
}
但是,唉,它仍然不起作用! 它在那条let
线上崩溃。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.