Ios 如何访问类';闭包中的变量是什么?

Ios 如何访问类';闭包中的变量是什么?,ios,swift,function,closures,Ios,Swift,Function,Closures,我读了这个主题:。但这对我没有帮助 问题 我有一个ViewControllerData来显示数据,还有一个ViewControllerEdit来编辑数据。我想将对象从ViewControllerData发送到ViewControllerEdit,我正在使用performSegue执行此操作,但我无法从ViewControllerEdit获取编辑过的对象。我想要像prepare函数中的参数一样传递闭包(funcReturnFromEdit) class ViewControllerData: UI

我读了这个主题:。但这对我没有帮助

问题

我有一个
ViewControllerData
来显示数据,还有一个
ViewControllerEdit
来编辑数据。我想将对象从
ViewControllerData
发送到
ViewControllerEdit
,我正在使用
performSegue
执行此操作,但我无法从
ViewControllerEdit
获取编辑过的对象。我想要像
prepare
函数中的参数一样传递闭包(funcReturnFromEdit)

class ViewControllerData: UIViewController, UITableViewDataSource, UITableViewDelegate {

    @IBOutlet weak var tableViewData: UITableView!
    var saleOrder : SaleOrder?  // THIS! <--------

    // In this closure I want take the edited object.
    let funcReturnFromEdit = { (saleEdited : SaleOrder) -> () in
        self.saleOrder = saleEdited // I can't do this. Error: Value of type '(ViewControllerData) -> () -> (ViewControllerData)' has no member 'saleOrder'
    }

    ....

      override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        segue.identifier == "segueEditOrder" {
        let editVc = segue.destination as! ViewControllerEdit
        if saleOrder != nil {
            editVc.saleOrderToEdit = saleOrder!.copy() as! SaleOrder
        }
        editVc.funcReturn = self.funcReturnFromEdit // <-- Not works
    }
}

如果需要在闭包中使用全局变量/方法,请将
self.
放在变量/方法之前

所以你可以替换这个

saleOrder = saleEdited

但问题似乎也在其他地方。您只需要将saleOrder从第一个视图控制器传递到第二个视图控制器,然后在其中编辑它,然后将数据传递回第一个视图控制器

因此,首先从ViewControllerData中删除不必要的代码:

let funcReturnFromEdit = { (saleEdited : SaleOrder) -> () in
    saleOrder = saleEdited // I can't do this. 
}
并修复
ViewControllerEdit
replace中的完成处理程序

var funcReturn = { (SaleOrder) -> Void in {} }

还可以编辑endEditions方法,因为funcReturn是可选的

func endEditions() {
    funcReturn?(saleOrderToEdit)
}
现在,只需在ViewControllerData中修复
prepare
方法,以设置当用户从
ViewControllerEdit

class ViewControllerEdit: UIViewController, UITableViewDelegate, UITableViewDataSource {

    var saleOrderToEdit : SaleOrder?

    var funcReturn = { (SaleOrder) -> Void in {} } // <- This not compile. How to do this?

    ...
    /*
     Funcs to make edition...
    */

    func endEditions() {
        funcReturn(saleOrderToEdit) // <- Here I want send to back ViewControllerData
    }
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "segueEditOrder" {
        let editVc = segue.destination as! ViewControllerEdit
        if let saleOrderToPass = saleOrder {
            editVc.saleOrderToEdit = saleOrderToPass
            editVc.funcReturn = { saleEdited in
                self.saleOrder = saleEdited //This code is executed when you call funcReturn?(saleOrderToEdit) from ViewControllerEdit
            }
        }
    }
}

如果需要在闭包中使用全局变量/方法,请将
self.
放在变量/方法之前

所以你可以替换这个

saleOrder = saleEdited

但问题似乎也在其他地方。您只需要将saleOrder从第一个视图控制器传递到第二个视图控制器,然后在其中编辑它,然后将数据传递回第一个视图控制器

因此,首先从ViewControllerData中删除不必要的代码:

let funcReturnFromEdit = { (saleEdited : SaleOrder) -> () in
    saleOrder = saleEdited // I can't do this. 
}
并修复
ViewControllerEdit
replace中的完成处理程序

var funcReturn = { (SaleOrder) -> Void in {} }

还可以编辑endEditions方法,因为funcReturn是可选的

func endEditions() {
    funcReturn?(saleOrderToEdit)
}
现在,只需在ViewControllerData中修复
prepare
方法,以设置当用户从
ViewControllerEdit

class ViewControllerEdit: UIViewController, UITableViewDelegate, UITableViewDataSource {

    var saleOrderToEdit : SaleOrder?

    var funcReturn = { (SaleOrder) -> Void in {} } // <- This not compile. How to do this?

    ...
    /*
     Funcs to make edition...
    */

    func endEditions() {
        funcReturn(saleOrderToEdit) // <- Here I want send to back ViewControllerData
    }
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "segueEditOrder" {
        let editVc = segue.destination as! ViewControllerEdit
        if let saleOrderToPass = saleOrder {
            editVc.saleOrderToEdit = saleOrderToPass
            editVc.funcReturn = { saleEdited in
                self.saleOrder = saleEdited //This code is executed when you call funcReturn?(saleOrderToEdit) from ViewControllerEdit
            }
        }
    }
}

您必须在
ViewControllerEdit
中声明一个完成闭包,并在
endEditions

class ViewControllerEdit: UIViewController, UITableViewDelegate, UITableViewDataSource {

    var saleOrderToEdit : SaleOrder!

    var editCompletion : ((SaleOrder)->())?

...

    func endEditions() {
        editCompletion?(saleOrderToEdit)
    }

ViewControllerData
prepare(for
分配闭包

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "segueEditOrder" {
        let editVc = segue.destination as! ViewControllerEdit
        if let saleOrderToEdit = saleOrder {
            editVc.saleOrderToEdit = saleOrderToEdit
            editVc.editCompletion = { [weak self] saleEdited in 
                self?.saleOrder = saleEdited
            }
        }
    }
}
出于安全原因,如果
saleOrder
nil

func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
    return saleOrderToEdit != nil
}

注意:请不要在Swift中使用丑陋的objective-c-ish
copy()
您必须在
ViewControllerEdit
中声明完成闭包,并在
endEditions中调用它

class ViewControllerEdit: UIViewController, UITableViewDelegate, UITableViewDataSource {

    var saleOrderToEdit : SaleOrder!

    var editCompletion : ((SaleOrder)->())?

...

    func endEditions() {
        editCompletion?(saleOrderToEdit)
    }

ViewControllerData
prepare(for
分配闭包

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "segueEditOrder" {
        let editVc = segue.destination as! ViewControllerEdit
        if let saleOrderToEdit = saleOrder {
            editVc.saleOrderToEdit = saleOrderToEdit
            editVc.editCompletion = { [weak self] saleEdited in 
                self?.saleOrder = saleEdited
            }
        }
    }
}
出于安全原因,如果
saleOrder
nil

func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
    return saleOrderToEdit != nil
}

注意:请不要在Swift中使用丑陋的objective-c-ish
copy()
错误:
类型的值“(ViewControllerData)->()->(ViewControllerData)”没有成员“saleOrder”
我可以创建一个函数来实现此操作:
editVc.funcReturn={saleEdited in self.saleOrder=saleEdited//当您从ViewControllerEdit调用funcReturn?(saleOrderToEdit)时,将执行此代码}
或者我每次都需要实现?@Augusto恐怕我不明白你的问题很简单,我想知道我是否可以在变量中声明它的代码块,以使用所需的x次。例如:
var mFuncReturn={saleEdited in self.saleOrder=saleEdited//调用funcReturn时执行此代码?(saleOrderToEdit)从ViewControllerEdit}
并使用
editVc.funcReturn=mFuncReturn
@Augusto是的,您只需声明var mFuncReturn:(SaleOrder)->(={saleEdited in self.SaleOrder=saleEdited}),然后使用editVc.funcReturn=mFuncReturnError:
类型的值(ViewControllerData)->(ViewControllerData)'没有成员'saleOrder'
我可以创建一个函数来实现这一点:
editVc.funcReturn={saleEdited in self.saleOrder=saleEdited//从ViewControllerEdit调用funcReturn?(saleOrderToEdit)时会执行此代码}
或者我每次都需要实现?@Augusto恐怕我不明白你的问题很简单,我想知道我是否可以在变量中声明它的代码块,以使用所需的x次。例如:
var mFuncReturn={saleEdited in self.saleOrder=saleEdited//调用funcReturn时执行此代码?(saleOrderToEdit)从ViewControllerEdit}
使用
editVc.funcReturn=mFuncReturn
@Augusto是的,只需声明var mFuncReturn:(SaleOrder)->(={saleEdited in self.SaleOrder=saleEdited},然后使用editVc.funcReturn=mFuncReturn为什么要使用
copy()
?我无法传递对象的相同引用。我如何做?
copy
是多余的。默认情况下会复制
struct
Array
Dictionary
之类的值类型。我想不会,我这样做是因为在
ViewControllerEdit
中编辑的数据也在
ViewControllerDa中编辑了相同的对象ta
,因为我实现了复制协议。我现在重新测试,
字典
传递您的引用,我需要复制。
[weak self]
self
捕获为弱,以避免保留周期。保留周期阻止对象被释放。为什么要注意使用
copy()
?我无法传递对象的相同引用。我如何做?
copy
是多余的。默认情况下会复制
struct
Array
Dictionary
之类的值类型。我想不会,我这样做是因为在
ViewControllerEdit
中编辑的数据也在
ViewControllerDa中编辑了相同的对象ta
,因为这我实现了复制协议。我现在重新测试,
字典
传递您的参考,我需要复制<