作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试更好地理解 Swift 中的协议(protocol)。特别是可选的协议(protocol)方法。我认为这个问题可能与我的协议(protocol)在不同的文件中定义/使用有关,但如果你将以下内容放在 Playground 上,你会遇到同样的问题:
import Foundation
@objc protocol MyProtocol {
optional func shouldJump() -> Bool
}
extension NSObject : MyProtocol {}
class Test {
func testJump() {
let object = NSObject()
let jump = object.shouldJump?() ?? true
print("should jump: \(jump)")
}
}
let t = Test()
t.testJump()
这是错误信息:
error: value of type 'NSObject' has no member 'shouldJump'
let jump = object.shouldJump?() ?? true
^~~~~~ ~~~~~~~~~~
出于某种原因,它不接受已在 NSObject 上定义的协议(protocol)。代码完成找到它,但编译器不允许它通过。
我不确定我的?? true
部分将起作用,但我希望它成为默认值,以防未定义该方法。
我如何让它工作?
最佳答案
您的 NSObject
符合 MyProtocol
,但是因为它没有实现可选的协议(protocol)方法,所以编译器知道它没有 Selector
shouldJump
:
let object = NSObject()
object.conformsToProtocol(MyProtocol) // true
object.respondsToSelector("shouldJump") // false
解决这个问题的一种方法是在扩展中实现协议(protocol)方法,以便对象执行该选择器:
extension NSObject : MyProtocol {
func shouldJump() -> Bool {
// some logic here
return true
}
}
class Test {
func testJump() {
let object = NSObject()
let jump = object.shouldJump()
print("should jump: \(jump)")
}
}
let t = Test()
t.testJump() // works
如果您不想在扩展中实现可选方法,您必须将 NSObject
转换为 MyProtocol
并验证它是否响应可选的 选择器
:
class Test {
func testJump() {
let object = NSObject()
let obj = object as MyProtocol
if object.respondsToSelector("shouldJump") {
let jump = obj.shouldJump?()
print("should jump: \(jump)")
} else {
print("nope")
}
}
}
您也可以跳过 respondsToSelector
步骤并使用 if let
或 guard
来验证 shouldJump()
返回非零值。
class Test {
func testJump() {
let object = NSObject()
guard let obj: MyProtocol = object else {
return // object does not conform to MyProtocol
}
if let jump = obj.shouldJump?() { // if shouldJump() returns non-nil
print("should jump: \(jump)")
} else {
print("nope")
}
}
}
关于swift - 类型 'X' 的值没有成员 'y' - 协议(protocol)中的可选函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35591784/
我正在尝试用 Swift 编写这段 JavaScript 代码:k_combinations 到目前为止,我在 Swift 中有这个: import Foundation import Cocoa e
我是一名优秀的程序员,十分优秀!