Как правильно создать подкласс SCNGeometry с собственными источниками и элементами?
Пытаюсь создать свой собственный обычай SCNGeometry
подкласс, аналогичный тому, как в фреймворке SCNBox
, SCNPyramid
, SCNCapsule
и т. д. Я уже создал свои исходные массивы и массивы элементов, но ниже приводится удобный инициализатор, а не назначенный!
public convenience init(
sources. : [SCNGeometrySource],
elements : [SCNGeometryElement]?)
Единственное, о чем я знаю, это super.init()
но если вы его используете, источники и элементы доступны только для чтения.
Неудачная попытка
Я попытался просто позвонить super.init()
, затем переопределите sources
а также elements
свойства с моими собственными массивами, но безрезультатно.
Примечание: это те же самые два массива, которые я передаю инициализатору удобства выше наSCNGeometry
напрямую, вместе с настройкой материалов, и это работает отлично, поэтому я знаю, что все массивы верны. Однако это не работает, поэтому очевидно, что в этом инициализаторе удобства происходит что-то еще, но я не вижу что.
Очень жаль, что Apple на самом деле не показывает вам источник подобных вещей и не имеет по ним хорошей документации. Я имею в виду они маркируютSCNGeometry
в качестве open
, но тогда не дайте вам никакой информации о том, как на самом деле его использовать, и поэтому многие документы API полностью пусты!
class TestGeometry : SCNGeometry {
override init(
sources : [SCNGeometrySource],
elements : [SCNGeometryElement],
materials : [SCNMaterials]){
self.mySources = sources
self.myElements = elements
super.init()
self.materials = materials
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private let mySources : [SCNGeometrySource]
private let myElements : [SCNGeometryElement]
override var sources : [SCNGeometrySource] { mySources }
override var elements : [SCNGeometryElement] { myElements }
}
Обходной путь
Я уже завершил всю информацию, чтобы успешно создать свои источники и элементы (опять же, те же самые, которые я пытался передать в свой класс выше), и подтвердил, что он работает и правильно отображает, используя инициализатор удобства, затем свойство материалов, поэтому технически я мог бы обернуть все это в статическую фабричную функцию и покончить с этим, но я действительно хочу следовать API Apple здесь, где вы создаете экземпляр геометрии через инициализатор, а не фабричную функцию, поэтому я не хочу просто позволять этому идти. Действительно неприятно, что все шаги с 2 по 'n' выполнены успешно, только чтобы полностью сбиться с пути на первом шаге... инициализации!
Итак, для чего назначен инициализатор SCNGeometry
это позволяет мне указывать мои собственные вершины, материалы и т. д., и если для этого нет его, как указать эту информацию при использовании super.init()
?
1 ответ
Да ладно... благодаря лабораториям DubDub в этом году инженеры Apple заявили, что это невозможно. Вы должны использовать удобный инициализатор, который вы можете использовать с помощью фабричных методов, если хотите. Позор.