首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >赋值MyScruct().var = results不会导致赋值

赋值MyScruct().var = results不会导致赋值
EN

Stack Overflow用户
提问于 2020-07-23 23:46:30
回答 1查看 24关注 0票数 0

好的..。可能是不好的标题。但在这里,问题来了。

代码语言:javascript
复制
struct DeckView: View {
    
    @State public var results = [ScryfallCard]()
    
    var body: some View {
        List(results, id: \.id ) { item in
            
            Mkae a list containing the results. 
            
        }.onAppear {
            ScryfallData().parseBulkData()
            print("Type of results::", type(of: results))
            print("results.capacity:", results.capacity)
        }
    }
}

struct ScryfallData {

    func parseBulkData() {
        let fm = FileManager.default
        let path = Bundle.main.resourcePath
        let items = try! fm.contentsOfDirectory(atPath: path!)
        var oracleFileName = ""
        
        for fileName in items {
            if fileName .hasPrefix("oracle-cards"){
                oracleFileName = fileName
            }
        }
        
        print("if let savedJson = Bundle.main.url")
        if let savedJson = Bundle.main.url(forResource: oracleFileName, withExtension: "") {
            if let dataOfJson = try? Data(contentsOf: savedJson) {
                print("if let dataOfJSON: \(dataOfJson)")
                do {
                    let scryfallDecodeData = try JSONDecoder().decode([ScryfallCard].self, from: dataOfJson)
                    print("scryfallDecodeData.capacity:", scryfallDecodeData.capacity)
                    
/* error here*/         DeckView().results = scryfallDecodeData
                    
                    print("DeckView().results: ", DeckView().results)
                    print("Decoded data:", type(of: scryfallDecodeData))
                } catch {
                    debugPrint("decode failed")
                }
            }
        }
    }
}

我一直在调试器里看到一个空白列表...

代码语言:javascript
复制
if let dataOfJSON: 73545913 bytes
scryfallDecodeData.capacity: 24391
DeckView().results:  []
Decoded data: Array<ScryfallCard>
Type of results:: Array<ScryfallCard>
results.capacity: 0

这意味着在这里标记为错误的行上,我将解码的数据赋值给DeckView().results变量,但最终结果是数据没有被赋值。知道我做错了什么吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-23 23:55:55

您不应该从视图模型(ScryfallData)创建View,而应该从parseBulkData函数返回解码的数据,并将其分配给ViewonAppear中的results

你的模型永远不应该知道你的UI。你的UI (在SwiftUI的情况下是View)应该拥有模型,而不是反过来。这实现了良好的关注点分离,并使您的业务逻辑平台和UI不可知。

代码语言:javascript
复制
struct DeckView: View {

    @State public var results = [ScryfallCard]()

    var body: some View {
        List(results, id: \.id ) { item in
            Text(item.text)
        }.onAppear {
            self.results = ScryfallData().parseBulkData()
        }
    }
}

struct ScryfallData {
    func parseBulkData() -> [ScryfallCard] {
        let fm = FileManager.default
        let path = Bundle.main.resourcePath
        let items = try! fm.contentsOfDirectory(atPath: path!)
        var oracleFileName = ""

        for fileName in items {
            if fileName .hasPrefix("oracle-cards"){
                oracleFileName = fileName
            }
        }

        if let savedJson = Bundle.main.url(forResource: oracleFileName, withExtension: "") {
            do {
                let jsonData = try Data(contentsOf: savedJson)
                let scryfallDecodeData = try JSONDecoder().decode([ScryfallCard].self, from: jsonData)
                return scryfallDecodeData
            } catch {
                debugPrint("decode failed")
                return []
            }
        }
        return []
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63058142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档