簡體   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