拡張するヘルパーメソッドがありますSKPhysicsContact
extension SKPhysicsContact {
/// - returns: `[SKPhysicsBody]` containing all the bodies that match `mask`
func bodiesMatchingCategory(mask: UInt32) -> [SKPhysicsBody] {
let bodies = [bodyA, bodyB]
return bodies.filter { ($0.categoryBitMask & mask) != 0 }
}
}
渡されdidBeginContact()
た でこのメソッドを呼び出しますcontact
。
func didBeginContact(contact: SKPhysicsContact) {
let ballMask: UInt32 = 0x1 << 2
let ball = contact.bodiesMatchingCategory(ballMask)
...
アプリをクラッシュさせる次のエラー メッセージが表示されることがあります (5 分の 1 など)。
-[PKPhysicsContact bodiesMatchingCategory:]: unrecognized selector sent to instance 0x165f2350
調べたところPKPhysicsContact
、プライベート フレームワークの一部です (リンク)。 SKPhysicsContact
の特定のプロパティのみを公開する単なる空のクラス定義のように見えますPKPhysicsContact
。
これは、SpriteKit チームの Objective-C ハックであり、Swift の強力なタイピングを壊しているように感じます。
ヘルプ?
いつでも戻ってくるようにするにはどうすればよいSKPhysicsContact
ですか?
テストするチェックを追加しましたSKPhysicsContact
let test = contact as Any
print("Test is: \(test)")
guard test is SKPhysicsContact else {
return
}
タイプの不一致を正しくキャッチします。
実際、!!?を返すことは決してありません。SKPhysicsContact
Objective-C でこれを実行しようとしましたが (レスポンダーの提案に従って)、同じ結果が得られました。
Apple Dev Forumsでディスカッションを行っており、将来の回答を求める人に役立つ可能性があります。
参照用の Objective-C コードは次のとおりです。
@interface SKPhysicsContact (MatchingBodies)
- (NSArray *)bodiesMatchingCategory:(UInt32)category;
@end
@implementation SKPhysicsContact (MatchingBodies)
- (NSArray *)bodiesMatchingCategory:(UInt32)category {
NSArray *bodies = @[self.bodyA, self.bodyB];
NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(SKPhysicsBody *body, NSDictionary *bindings) {
return (body.categoryBitMask & category) != 0;
}];
NSArray *matching = [bodies filteredArrayUsingPredicate:predicate];
return matching;
}
@end
ここで呼び出されます:
-(void)didBeginContact:(SKPhysicsContact *)contact
{
static const uint32_t MarbleContact = 0x1 <<1; // 2
static const uint32_t GoalContact = 0x1 <<2; // 4
SKPhysicsBody *ball = [contact bodiesMatchingCategory:MarbleContact].firstObject;
NSLog(@"Ball: %@", ball);
...
このクラッシュを返します:
-[PKPhysicsContact bodiesMatchingCategory:]: unrecognized selector sent to instance 0x17dad9e0
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[PKPhysicsContact bodiesMatchingCategory:]: unrecognized selector sent to instance 0x17dad9e0'
Apple のバグレポートを追加、#23332190