繁体   English   中英

从 Function 返回数组(Swift)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM