【问题标题】:How Do I Only Initialize ONE Of My Class's Properties?我如何只初始化我的类的一个属性?
【发布时间】:2021-02-27 05:30:44
【问题描述】:

我有一个具有三个属性topicnavBarHiddenviewModel 的类,我需要使用该类的一个属性topic 来初始化视图模型。 但我不需要初始化其他属性,```topic.我必须初始化视图模型,因为它会进行必要的 API 调用。

这是代码的 sn-p。

struct TopicCell: View {
    @Binding var navBarHidden : Bool?
    @State var topic: Topic?
    @ObservedObject var viewModel : TopicCellViewModel
    
    init() {
        self.viewModel = TopicCellViewModel(topic: self.topic!)
    }
    
}

起初topicnavBarHidden 不是可选的,但后来我不得不初始化它们,我不想这样做。初始化它们的所有数据都需要传入。所以我将它们设为可选项,这样我就不必初始化它们了,然后我只需要强制解开可选项。

但这给了我一个问题。

NavigationLink( 
destination: DebateChatView(navBarHidden: $navBarHidden, topic: $topic, subtopic:
 .constant(SubTopic(dictionary: ["id": "", "topic": "Random Subtopic", "title": topic!.title, 
"bool": false , "messages": MOCK_MESSAGEZ])))

请注意topicnavBarHidden 这两个绑定变量。这些现在不起作用,因为 DebateChatView 期望绑定正常数据,而不是绑定选项。但是$topic! 不起作用。那么,有人可以告诉我解决此问题的最佳方法吗?

【问题讨论】:

  • 使布尔值可选听起来不太好。布尔值要么为真,要么为假。绑定布尔将从父视图接收值,那么为什么是可选的?您还使“主题”成为可选的,并立即在初始化程序中强制解包,这很危险,您没有在哪里提供任何值。为什么不给它们默认值?
  • @TusharSharma 在我调用 TopicCell 时需要传入主题。因此,它不应该有默认值。 navBarHidden 也应该由父对象决定,所以它不应该有默认值

标签: swift binding swiftui optional forced-unwrapping


【解决方案1】:

正如您所说,值将在父级传递时确定,您可以initialise 目标视图接受那些parameters 并简单地分配值。

import SwiftUI

struct TopicCell: View {
    @Binding var navBarHidden : Bool
    @State var topic: Topic
    @ObservedObject var viewModel : TopicCellViewModel
    
    init(topic:Topic,barHidden:Binding<Bool>) {
        _navBarHidden = barHidden
        _topic = State(wrappedValue: topic)
        self.viewModel = TopicCellViewModel(topic:topic)
    }
    
    var body: some View{
        NavigationView{
            ForEach(0..<5) { index in
               
                    // Some stuff
               
            }
        }
    }
}

struct CellView:View {
    @State var isBarHidden = false
    
    var body: some View{
        TopicCell(topic: Topic(name: "someName"), barHidden: $isBarHidden)
    }
}

struct Topic{
    var name:String
}

class TopicCellViewModel:ObservableObject{
    var topic:Topic
    
    init(topic:Topic) {
        self.topic = topic
    }
}

【讨论】:

  • 是的,这完全正确,这是我自己找到的解决方案。你是如何学习这些东西的,比如 `_topic 和 State(wrappedValue)?我只是通过随机的谷歌搜索发现了这些,这对我来说不是完成这个项目的一种省时的方式。所以我想问我在哪里可以学习所有这些特定的技巧,比如用下划线和 State(wrappedValue) 进行初始化,这样我就可以知道它们
  • @CaylandBoston 你可以抽出 15 分钟,然后用谷歌搜索当你将 State 或任何其他属性包装器写入变量时会发生什么。
  • 花 15 分钟在谷歌上搜索每一个问题是学习如何编程的一种非常低效的方法,我认为您以更好的方式学习它
猜你喜欢
  • 1970-01-01
  • 2012-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多