Сбой в определении структуры Swift.Есть обходной путь, но хотел бы улучшить понимание - PullRequest
0 голосов
/ 29 ноября 2018

У меня было следующее определение структуры, которое получало бы сбой во время выполнения в сборках Release, но не в сборках Debug.Неинициализированная переменная или, возможно, разница в порядке инициализации?

struct Location:Codable {

    struct Commute {

        static let Times = [
            ["seconds" : 30],
            ["seconds" : 45],
            ["seconds" : 60],
            ["seconds" : 90]
        ]

        static let count = Commute.Times.count

        /* 
            next code line crashes on initialisation
            XCode: specialized _ArrayBuffer._checkInoutAndNativeTypeCheckedBounds(_:wasNativeTypeChecked:) [inlined]
        */
        static let Default = Commute.Times[Commute.Times.endIndex]

        ...
       }
}

Похоже, что мое использование Commute.Times.endIndex используется немного раньше, чем инициализируется Commute.Times, так что endIndex не имеет ссылок.

Я могу обойти это, заменив 'оскорбительную' строку на:

 static let Default = Commute.Times[Commute.count - 1]

Правильно ли я использовал static и правильно определил структуру?Это мое понимание в этой области, которое я хочу уточнить.

Бонус: есть ли более чистый способ установить Default для последнего элемента Times, чем указание count - 1?

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Массив имеет член last, который является необязательным (поскольку вы можете иметь пустой массив).Если вы знаете, что он на самом деле не пустой, вы можете принудительно развернуть его:

static var Default: [String: Int] = { Commute.Times.last! }()

Хотя, честно говоря, мне кажется странным, что у вас есть массив словарей из одного элемента.Возможно, NSOrderedSet или массив кортежей [(String, Int)] более уместен здесь в зависимости от вашего фактического варианта использования.

0 голосов
/ 29 ноября 2018

Этот код должен давать сбой либо в режиме отладки, либо в режиме выпуска.

определение endIndex-

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

При отладке вы должны получить ошибку «Индекс вне диапазона»

...