Ошибка SCNPhysicsWorld

Я возился со Swift и пытался заставить работать Physicsworld.

Это ошибка, которую я получаю «Неопределенные символы для архитектуры i386: «_OBJC_CLASS_$_SCNPhysicsWorld», на которую ссылается: __TFC3sk218GameViewController11viewDidLoadfS0_FT_T_ в GameViewController.o ld: символ (ы) не найден для архитектуры i386 clang: ошибка: команда компоновщика не удалась с кодом выхода 1 ( используйте -v, чтобы увидеть вызов) "

Я предполагаю, что это связано со связыванием или импортом библиотеки, которой я не являюсь, но я добавил все, что смог найти, что, по моему мнению, могло бы это исправить (найдено в других сообщениях об игровом наборе). Кто-нибудь знает, что это может быть? Спасибо.


person Cherr Skees    schedule 09.06.2014    source источник
comment
Вы используете бета-версию Xcode 6 на OS X 10.9? Физика — это новая функция в Scene Kit для 10.10.   -  person rickster    schedule 10.06.2014
comment
Ах... Да. Я запускаю xcode beta6 на osx 10.9.   -  person Cherr Skees    schedule 10.06.2014
comment
Я запускаю симулятор iOS 8. Я не думал, что ОС вызовет эту проблему, поскольку программное обеспечение предназначено для iOS.   -  person Cherr Skees    schedule 10.06.2014
comment
У меня тоже была эта ошибка - в остальном физика работает, но вы не можете получить доступ к свойству physicsWorld? Это доступно, если вы используете Objective-C, хотя это кажется странным   -  person davbryn    schedule 10.06.2014
comment
Да, я пытался научиться быстрому, вот и все.   -  person Cherr Skees    schedule 10.06.2014
comment
Я тоже это вижу — на самом деле это похоже на ошибку в мосте Swift-Objective-C / Xcode 6. В документации довольно ясно, что она должна быть доступна.   -  person patr1ck    schedule 11.06.2014
comment
FWIW, я подал rdar://17264213   -  person patr1ck    schedule 11.06.2014


Ответы (1)


Тут баг с мостом Obj-c/Swift.

Пока вы ждете решения, вы можете обойти это, создав для себя временный мост:

Добавьте следующий класс:

PhysWorldBridge.h

#import <Foundation/Foundation.h>
#import <SceneKit/SceneKit.h>//

@interface PhysWorldBridge : NSObject

- (void) physicsWorldSpeed:(SCNScene *) scene withSpeed:(float) speed;
- (void) physicsGravity:(SCNScene *) scene withGravity:(SCNVector3) gravity;

@end

PhysWorldBridge.m

#import "PhysWorldBridge.h"

@implementation PhysWorldBridge

- (id) init
{
    if (self = [super init])
    {        
    }
    return self;
}

- (void) physicsWorldSpeed:(SCNScene *) scene withSpeed:(float) speed
{
    scene.physicsWorld.speed = speed;
}

- (void) physicsGravity:(SCNScene *) scene withGravity:(SCNVector3) gravity
{
    scene.physicsWorld.gravity = gravity;
}

@end

Xcode должен предложить вам создать XXX-Bridging-Header.h при добавлении первого файла target-c. Пусть он создаст этот файл.

Добавьте импорт для класса в «XXX-Bridge-header.h»:

//
//  Use this file to import your target's public headers that you would like to expose to Swift.
//

#import "PhysWorldBridge.h"

Теперь вы можете использовать этот (хакерский) мост для установки свойств из Swift:

//scene.physicsWorld.speed = 2.0
// CAN'T USE ABOVE OR LINKER ERROR


let bridge = PhysWorldBridge();
bridge.physicsWorldSpeed(scene, withSpeed: 2.0);
//This call bridges properly

//So would the gravity one:
bridge.physicsGravity(scene, withGravity: SCNVector3Make(0, -90.81, 0));
person davbryn    schedule 11.06.2014
comment
Я думаю, что будет лучше использовать статический класс для всех несоответствий, в будущем, когда ошибка будет исправлена, просто замените статические строки быстрым кодом. - person HotJard; 01.07.2014