Ios 在类中使用结构中的函数

Ios 在类中使用结构中的函数,ios,swift,function,class,structure,Ios,Swift,Function,Class,Structure,我是Swift新手,在使用类和结构时遇到困难 我有一个名为Workspace的结构: struct Workspace: Decodable { var guid: String var name: String func getUserWorkspace(base: String, completed: @escaping () -> ()){ //some code } } 这是我的类用户: public class User { var Wor

我是Swift新手,在使用类和结构时遇到困难

我有一个名为Workspace的结构:

struct Workspace: Decodable {
var guid: String
var name: String

func getUserWorkspace(base: String, completed: @escaping () -> ()){
        //some code
    }
}
这是我的类用户:

public class User {

    var Wor = [Workspace]()
    var WorData:Workspace? = nil

   //+some other var & functions
}
因此,我在视图控制器中所做的是:

class SecondViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

@IBOutlet weak var listView: UITableView!

var co = User()

override func viewDidLoad() {
    super.viewDidLoad()

    co.WorData?.getUserWorkspace(base: co.Base) {
        print("success")
        self.listView.reloadData()
        self.updateVertically()
    }
    listView.delegate = self
    listView.dataSource = self
}
问题是代码从未进入函数co.WorData?.getUserWorkspace(base:co.base)中


在我把它放到结构中之前,它直接在类中,但是因为我改变了它,它不再工作了,所以我想我可能用错误的方式来调用它

WorData
为零

条件展开(
co.WorData?.getUserWorkspace(base:co.base)
将在尝试调用该方法之前检查WorData是否有值。如果该值为nil且Swift未执行此操作,则它将崩溃

您需要始终将其设置为新的

var worData = Workspace() 
在类init之后设置它

var user = User()
user.worData = Workspace() // or pass a specific one in
或者要求使用工作区初始化用户对象

class User: NSObject {
    var wor = [Workspace]()
    var workspace: Workspace // use lower camel case for var names

    required init(workspace: Workspace) {
        self.workspace = workspace
    }

}

WorData
为零

条件展开(
co.WorData?.getUserWorkspace(base:co.base)
将在尝试调用该方法之前检查WorData是否有值。如果该值为nil且Swift未执行此操作,则它将崩溃

您需要始终将其设置为新的

var worData = Workspace() 
在类init之后设置它

var user = User()
user.worData = Workspace() // or pass a specific one in
或者要求使用工作区初始化用户对象

class User: NSObject {
    var wor = [Workspace]()
    var workspace: Workspace // use lower camel case for var names

    required init(workspace: Workspace) {
        self.workspace = workspace
    }

}

请,请永远不要将类中的属性声明为隐式未包装可选属性,这些属性在
init
方法中初始化为非可选属性。删除感叹号时,您可能会感到惊讶,但不会出现编译器错误。感谢您的建议,我将删除该属性。请永远不要在类a中声明属性在
init
方法中初始化为非可选的隐式展开可选。您可能会感到惊讶,但在删除感叹号时不会出现编译器错误。感谢您的建议,我将删除它