从未使用过捕获自我

Posted

技术标签:

【中文标题】从未使用过捕获自我【英文标题】:Capture self was never used 【发布时间】:2016-11-03 15:03:52 【问题描述】:

我没有发布整个代码,因为它确实太大了。反正就是这样构建的用户注册。

有一个 modal 的子是 pageViewController:

第一页用于登录; 第二页用于注册;

从 Login 您可以到达 Registration,一旦注册,pageViewController 应该会自动转换到第一页,以便用户可以使用他的新凭据登录。

用户注册过程由按钮和 Alamofire 管理:一旦单击按钮,用户在文本字段中插入的值将被验证,然后我启动一个 post 请求,将数据发送到服务器并接收 JSON 数据返回等一下。

这东西很简单(不好意思说太多了),但最后,在我收到JSON后,这里发生了一些奇怪的事情:

let j = JSON as! NSDictionary
let userStatus = j.object(forKey: "status")!

    if((userStatus as! Int) == 0)

        //
        print("user registerd")

        let alert = UIAlertController(title: "Registration ok", message: "Registration OK", preferredStyle:UIAlertControllerStyle.alert)

        let okAlert = UIAlertAction(title:"OK", style: .default, handler: action in v.scrollToPreviousViewController() )

        alert.addAction(okAlert)

        self.present(alert, animated: true, completion: nil)

这段代码应该做什么?一旦用户单击警报按钮,pageviewcontroller 应该会以动画方式返回登录屏幕。

会发生什么?它返回那里但没有动画。

这让我认为我应该避免“污染”保留给 GUI 的全局线程。而且,事实上,我试图把所有的代码都放在一个:

DispatchQueue.main.async  [unowned self] in

没有任何成功。

然后,我尝试了另一件事:

let okAlert = UIAlertAction(title:"OK", style: .default, handler:
                                            action in DispatchQueue.main.async  [unowned self] in v.scrollToPreviousViewController() )

我不完全理解为什么,但这实际上有效并消除了动画问题。

但是那里的unowned self 会产生警告:“”。我究竟做错了什么?

【问题讨论】:

【参考方案1】:

如果您没有在异步块内使用self,那么您显然会收到此警告。请尝试使用_ 而不是self

【讨论】:

它有效。它也可以只留下 v.scrollToPreviousViewController()。但是,这是做我正在做的事情的正确方法吗? :-) 是的,这很完美。如果您同意,请接受答案。 如果同时有人没有发布有趣的东西,我明天接受答案:-) 如果我用 _ 替换我得到“封闭捕获列表中的预期名称”【参考方案2】:

要查看快速捕获列表的用途,请查看此示例 ...

var i = 25

var cl = print(i)
var clc = [i] in print(i)

i = 35

cl()   // 35
clc()  // 25

因此,警告消息“从未使用过捕获自我”是不言自明的。你不需要把 self 放在你的捕获列表中,因为你不在那里使用它

【讨论】:

@IanBell 哪个错误,在哪里?它按预期在我的操场上工作 对不起,我错了,这是 XCode 错误,不是你的代码 :-)

以上是关于从未使用过捕获自我的主要内容,如果未能解决你的问题,请参考以下文章

奇怪的错误:未捕获的TypeError:非法调用ajax

为啥 Swift 闭包不捕获自我?

Firebase 消息传递 iOS:usersInfo 为空或我从未收到通知

SwiftUI 转义闭包捕获变异的“自我”参数

漏洞分析——变量缺陷漏洞及通用异常捕获声明缺陷漏洞

Nuxt 常量被赋值但从未使用过