ich eine Hilfsmethode haben, die SKPhysicsContact
didBeginContact bestanden PKPhyicsObject
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 }
}
}
in didBeginContact()
erstreckt Ich nenne diese Methode auf dem in contact
geben.
func didBeginContact(contact: SKPhysicsContact) {
let ballMask: UInt32 = 0x1 << 2
let ball = contact.bodiesMatchingCategory(ballMask)
...
Ich erhalte diese Fehlermeldung manchmal (wie 1: 5), die die App abstürzt:
-[PKPhysicsContact bodiesMatchingCategory:]: unrecognized selector sent to instance 0x165f2350
ich PKPhysicsContact
nachgeschlagen und es ist Teil eines privaten Rahmen (link). SKPhysicsContact
sieht aus wie es ist nur eine leere Klassendefinition, die nur bestimmte Eigenschaften von PKPhysicsContact
offen legt.
Ich glaube, das ist ein Objective-C-Hack im SpriteKit-Team, der Swifts starke Typisierung durchbricht.
Hilfe?
Wie stelle ich sicher, dass ich immer SKPhysicsContact
zurück bekomme?
habe ich einen Scheck für SKPhysicsContact
let test = contact as Any
print("Test is: \(test)")
guard test is SKPhysicsContact else {
return
}
zu testen, welche die Art mis-match richtig einrastet.
Tatsächlich ist es NIE gibt SKPhysicsContact
zurück !!?
Ich habe versucht, dies in Objective-C (wie von Responder vorgeschlagen) und ich bekomme das gleiche Ergebnis.
Ich habe eine Diskussion über die Apple Dev Forums, die zukünftige Antwort-Sucher einige Hilfe bieten kann.
Hier ist die Objective-C-Code als Referenz:
@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
hier genannt:
-(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);
...
Rückgabe dieser Absturz:
-[PKPhysicsContact bodiesMatchingCategory:]: unrecognized selector sent to instance 0x17dad9e0
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[PKPhysicsContact bodiesMatchingCategory:]: unrecognized selector sent to instance 0x17dad9e0'
hinzugefügt Bug Report für Apple, # 23332190
Wo ist 'bodysMatchingCategory' definiert? Ist das eine Erweiterung von 'SKPhysicsContact'? –
@BenKane ja, es ist an der Spitze meiner Frage –
Oh, wow. Ich weiß nicht, wie ich das verpasst habe :) Wie auch immer, siehe meine Antwort. Ich ging davon aus, dass dies der Fall war. –