`supportSecureCoding` вылетает при использовании опции Optimize for Speed - PullRequest
0 голосов
/ 27 сентября 2018

У меня проблемы с созданием классов, использующих NSSecureCoding и его подклассы.

class ClassA: NSObject, NSSecureCoding {
    public static var supportsSecureCoding: Bool { return true }
}

class ClassB: ClassA {
    public static var supportsSecureCoding: Bool { return true } // "Cannot override static var"
}

Я должен вызывать это, поскольку документация в NSObject.h гласит:

Это свойство должно возвращать YES для всех классов, которые разрешают безопасное кодирование.Подклассы классов, которые принимают NSSecureCoding и переопределяют initWithCoder: также должны переопределить этот метод и вернуть YES.// При написании методов, которые декодируют данные, следует обращаться к руководству по безопасному кодированию.

Objective-C:

@property (class, readonly) BOOL supportsSecureCoding;

Swift:

public static var supportsSecureCoding: Bool { get }

IЯ использую Xcode 10.0, пробовал как на Swift 4.0, так и на Swift 4.2.Как люди обходят это?Любая помощь приветствуется.

ОБНОВЛЕНИЕ: при использовании public class var supportsSecureCoding он компилируется, но вылетает во время выполнения, когда используется Оптимизация для скорости.

Ответы [ 3 ]

0 голосов
/ 30 сентября 2018

Кажется, что текущий оптимизатор Swift подавляет генерацию переопределенного метода getter, когда его определение совпадает с его суперклассом.Что за умный оптимизатор!?

Этот вид хака подавил бы слишком сильную оптимизацию.

class ClassB: ClassA {

    //...

    static private var secureCoding = true
    override public class var supportsSecureCoding: Bool { return secureCoding }

}

static private let не имеет такого же эффекта.Поэтому, когда оптимизатор Swift более умный, приведенный выше код может не работать.Лучше отправьте отчет об ошибке в ближайшее время.


Похоже, оптимизатор Swift уже достаточно умен и обходной путь, описанный выше, может не сработать.(См. Комментарий Мартина Р.) *

Возможно, вам придется удалить private.

class ClassB: ClassA {

    //...

    static var secureCoding = true
    override public class var supportsSecureCoding: Bool { return secureCoding }

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

Исправление, которое работало для меня

private static var secureCodingWorkaround = true
@objc override public class var supportsSecureCoding: Bool { return secureCodingWorkaround }
0 голосов
/ 27 сентября 2018

static в объявлении класса - это псевдоним для final class, то есть метод типа, который нельзя переопределить в подклассе.Вам нужен метод class

public class var supportsSecureCoding: Bool { return true }

, который можно переопределить в подклассе с помощью

override public class var supportsSecureCoding: Bool { return true }
...