2015-01-16 3 views
4

Я хотел бы расширить SCNNode (если возможно) в Swift. Вот моя попытка:Расширение SCNNode в Swift

class MyNode : SCNNode { 

    override init(geometry: SCNGeometry) -> SCNNode { 
     return super.init(geometry) 
    } 

    /* Xcode required this */ 
    required init(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 
} 

оператор -> что помечается с ошибкой «Последовательные декларации по линии должны быть разделены;».

Я знаю, что это не правильно, но если я юмор Xcode это «исправляет» это следующим образом:

override init(geometry: SCNGeometry); -> SCNNode { 

Какой бред, а затем Xcode жалуется на «Ожидаемое заявление».

Я не совсем понимаю реализацию SCNNode - если я посмотрю на нее в Xcode, все объявлено как абстрактное (в комментариях) и не предлагает реализации. Документы не предполагают, что что-либо выходит из SCNNode, вы создаете его напрямую, поэтому я предполагаю, что смогу его расширить.

ответ

4

Вы можете просто сделать:

class MyNode : SCNNode { 
    /* Xcode required this */ 
    required init(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 
} 

Который наследует обозначенную Инициализатора от базового класса.

Если вы хотите указать свой собственный Инициализатор, который принимает геометрию, вы должны вызвать назначенный Инициализатор базового класса, так что я бы сказал, что это было бы то, что вы хотите:

class MyNode : SCNNode { 
    init(geometry: SCNGeometry) { 
     super.init() 
     self.geometry = geometry 
    } 
    /* Xcode required this */ 
    required init(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 
} 

Инициализатор, который вы видите в коде SCNNode.h, является инициатором, переведенным (автоматически, я полагаю) из метода Objective C nodeWithGeometry. Я считаю, что это инициализатор удобства, хотя он специально не помечен как таковой, что я бы сказал, это ошибка/ограничение автоматического преобразования файла заголовка. The documentation конкретно говорит:

Для удобства и простоты, методы фабрики Objective-C отображаются в качестве инициализаторов удобства в Swift.

Не путайте слово abstract в комментариях; это тег HeaderDoc для краткого описания метода, т. е. «абстрактное» используется в значении an abridgement or summary.

+0

Спасибо за ваш тщательный ответ. Ваше первое предложение не сработало - оно удалило ошибку из MyNode, но добавило ошибку к созданию экземпляра «Невозможно вызвать init с помощью списка аргументов геометрии типа». Тем не менее, ваше второе предложение сделало так много, спасибо :) Отмечено в заголовочных документах. – PorridgeBear

+0

Нет проблем. Да; Я не был уверен, что вы специально хотели расширить SCNNode с помощью конструктора геометрии или пытаетесь ли вы таким образом, потому что конструктор геометрии выглядел как назначенный инициализатор, поэтому вы пытались сделать компилятор счастливым :) –