我正在Swift中编写一个辅助函数,用于SpriteKit游戏,它将检查是否已正确设置了冲突拘留.
我想检查我的GameScene是否实现了协议SKPhysicsContactDeletegate
并且还包含该didBeginContact
功能.
我有以下代码,在Xcode的自动完成的帮助下编写:
if GameScene(conformsToProtocol(SKPhysicsContactDelegate)) {
if GameScene(respondsToSelector(didBeginContact(SKPhysicsContact))) {
print("Self implements SKPhysicsContactDelegate and didBeginContact appears to be present")
}
}
Run Code Online (Sandbox Code Playgroud)
然后Xcode抱怨我的conformsToProtocol
抱怨
'参数标签'(_ :)'与任何可用的重载都不匹配'
没有任何建议如何解决.它也反对respondsToSelector
,说明这一点
'无法将类型的值'(SKPhysicsContact).Type'(又名'SKPhysicsContact.Type')转换为预期的参数类型'SKPhysicsContact'
如何检查我的GameScene是否符合此协议并实现此功能?
编辑:这是我的代码基于答案:
if GameScene.self is SKPhysicsContactDelegate {
print("Yes it's a delegate")
}
Run Code Online (Sandbox Code Playgroud)
输出: Yes it's a delegate
let yy = (GameScene.self as? SKPhysicsContactDelegate)?.didBeginContact
print("yy is \(yy)")
Run Code Online (Sandbox Code Playgroud)
输出: yy is nil
if (GameScene.self as? SKPhysicsContactDelegate)?.didBeginContact != nil {
print("Yes it's a delegate and the function is there")
}
Run Code Online (Sandbox Code Playgroud)
没有输出.
red*_*t84 30
你还在思考Objective-C,拥抱Swift!
假设您的协议如下所示:
@objc protocol SKPhysicsContactDelegate {
optional func didBeginContact()
}
Run Code Online (Sandbox Code Playgroud)
试试这个:
if let delegate = gameScene as? SKPhysicsContactDelegate {
delegate.didBeginContact?()
}
Run Code Online (Sandbox Code Playgroud)
或者一个班轮:
(gameScene as? SKPhysicsContactDelegate)?.didBeginContact?()
Run Code Online (Sandbox Code Playgroud)
请注意?
调用中的方法名称之后?这是因为该方法是可选的,如果对象没有实现该方法,则不会调用它.而if let
如果对象不符合分支不再执行SKPhysicsContactDeletegate
协议.
要在调用之前检查方法本身是否存在,只需省略方法调用以获取对该方法的引用,并像任何其他变量一样检查它:
if let method = (gameScene as? SKPhysicsContactDelegate)?.didBeginContact {
print("gameScene conforms to SKPhysicsContactDelegate and implements didBeginContact")
// Call it later whenever you want
method()
}
Run Code Online (Sandbox Code Playgroud)
如果您以后不需要再打电话,请检查nil
:
if (gameScene as? SKPhysicsContactDelegate)?.didBeginContact != nil {
print("gameScene conforms to SKPhysicsContactDelegate and implements didBeginContact")
}
Run Code Online (Sandbox Code Playgroud)
检查optional static
方法使用相同的方法,但需要类对象而不是类的实例:
if (GameScene.self as? OptionalProtocol.Type)?.staticMethod != nil {
print("gameScene conforms to OptionalProtocol and implements staticMethod")
}
Run Code Online (Sandbox Code Playgroud)
请注意GameScene.self
获取对象类型并<protocol>.Type
转换为协议类而不是协议实例.
随附Playgrounds,Swift脚本或任何在线Swift编译器的完整示例:
import Foundation
@objc protocol OptionalProtocol {
optional func instanceMethod()
optional static func staticMethod()
}
class Nothing {}
class Something: OptionalProtocol {}
class Bar: NSObject, OptionalProtocol {
func instanceMethod() {
print("Instance method")
}
}
class Foo: NSObject, OptionalProtocol {
static func staticMethod() {
print("Static method")
}
}
// Cast instances to 'Any' and classes to 'AnyClass'
let nothing: Any = Nothing()
let nothingClass: AnyClass = Nothing.self
let something: Any = Something()
let somethingClass: AnyClass = Something.self
let bar: Any = Bar()
let barClass: AnyClass = Bar.self
let foo: Any = Foo()
let fooClass: AnyClass = Foo.self
nothing is OptionalProtocol // false
(nothing as? OptionalProtocol)?.instanceMethod != nil // false
(nothing as? OptionalProtocol)?.instanceMethod?() // Does nothing
(nothingClass as? OptionalProtocol.Type)?.staticMethod != nil // false
(nothingClass as? OptionalProtocol.Type)?.staticMethod?() != nil // Does nothing
something is OptionalProtocol // true
(something as? OptionalProtocol)?.instanceMethod != nil // false
(something as? OptionalProtocol)?.instanceMethod?() // Does nothing
(somethingClass as? OptionalProtocol.Type)?.staticMethod != nil // false
(somethingClass as? OptionalProtocol.Type)?.staticMethod?() != nil // Does nothing
bar is OptionalProtocol // true
(bar as? OptionalProtocol)?.instanceMethod != nil // true
(bar as? OptionalProtocol)?.instanceMethod?() // Prints 'Instance method'
(barClass as? OptionalProtocol.Type)?.staticMethod != nil // false
(barClass as? OptionalProtocol.Type)?.staticMethod?() != nil // Does nothing
foo is OptionalProtocol // true
(foo as? OptionalProtocol)?.instanceMethod != nil // false
(foo as? OptionalProtocol)?.instanceMethod?() // Does nothing
(fooClass as? OptionalProtocol.Type)?.staticMethod != nil // true
(fooClass as? OptionalProtocol.Type)?.staticMethod?() != nil // Prints 'Static method'
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
15419 次 |
最近记录: |