Как правильно создать подкласс 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 заявили, что это невозможно. Вы должны использовать удобный инициализатор, который вы можете использовать с помощью фабричных методов, если хотите. Позор.

Другие вопросы по тегам