type() 不符合协议 anyobject

Posted

技术标签:

【中文标题】type() 不符合协议 anyobject【英文标题】:type () does not conform to protocol anyobject 【发布时间】:2015-08-04 14:01:12 【问题描述】:

我正在尝试在离开视图控制器之前确认提交:

但是我收到了这个错误:

type () does not conform to protocol anyobject

这是出现错误的那一行:

        self.navigationItem.backBarButtonItem?.target = self.validateBeforeBack("back", completion:  (bool) -> () in
        self.navigationController?.popViewControllerAnimated(true)
    )

UDATE: 所以解决方案是将 target 更改为 action 并将函数调用放入Selector()

那就是:

    self.navigationItem.backBarButtonItem?.action = Selector(self.validateBeforeBack("back", completion:  (bool) -> () in
        self.navigationController?.popViewControllerAnimated(true)
    ))

【问题讨论】:

把你的委托方法@optional. @ChetanPrajapati 我没有使用委托方法来解决这个问题,你能解释一下 func R U 的含义吗 【参考方案1】:

不清楚validateBeforeBack() 返回什么,因为您没有提供它。从错误中,我假设它返回()(即“void”或“nothing”)。您不能将结果分配给属性。

我假设您真正想做的是在按下按钮时调用此函数。这不是目标/操作按钮的工作方式。请参阅Concepts in Objective-C Programming 中的Target-Action。您需要将target 设置为您希望将消息发送到的对象,并将action 设置为您要发送的选择器。

【讨论】:

闭包应该返回什么才能被接受为目标或动作? 闭包既不是目标也不是动作。您是否阅读过 Cocoa 中目标动作模式的链接介绍?该函数需要返回一个响应操作选择器的对象。通常目标是视图控制器,动作是你要调用的方法。【参考方案2】:

    popViewControllerAnimated(_:) 的返回类型为 UIViewController?,但是函数 validateBeforeBack(_:completion:) 的闭包参数具有 Void 返回类型(validateBeforeBack(_:completion:) 函数的实现,或者闭包你传递给它,应该考虑到这一点进行调整)

    确保您的 validateBeforeBack(_:completion:) 函数实际上具有返回类型(因为它是赋值中的值)

【讨论】:

以上是关于type() 不符合协议 anyobject的主要内容,如果未能解决你的问题,请参考以下文章

类型 '[String, AnyObject?]' 不符合协议 AnyObject?:为啥?

类型“NSFastEnumerationIterator.Element”(又名“Any”)不符合协议“AnyObject”

类型“ViewController”不符合协议

类型“ContentView”不符合协议“View”(Xcode - Swift UI)

类型 '' 不符合协议 'Decodable'/'Encodable'

类型“Favorites.Type”不能符合“Encodable”;只有结构/枚举/类类型可以符合协议