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-ishcopy()
错误:类型的值“(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
,因为这我实现了复制协议。我现在重新测试,字典
传递您的参考,我需要复制<