Как правильно создать подкласс 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()?


person Mark A. Donohoe    schedule 14.06.2020    source источник


Ответы (1)


Хорошо... благодаря лабораториям DubDub в этом году инженеры Apple сказали, что это невозможно. Вы должны использовать удобный инициализатор, который вы можете использовать с помощью фабричных методов, если хотите. Стыд.

person Mark A. Donohoe    schedule 27.06.2020