В указателе отсутствует спецификатор типа обнуляемости в автоматически сгенерированном файле ModuleName-Swift.h - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть проект с исходниками swift и ObjC, и в автоматически сгенерированном заголовочном файле есть странное сообщение:

enter image description here

Код, помеченный с ошибкой:

//interface in ModuleName-Swift.h  file
@interface PointsList : NSObject
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
- (nonnull instancetype)initWithPoints:(NSArray<NSValue *> * /*this marked with warning*/_Nonnull)points OBJC_DESIGNATED_INITIALIZER; //Warning:Pointer is missing a nullability type specifier (_Nonnull, _Nullable, or _Null_unspecified)
- (nonnull instancetype)initWithValues:(NSArray<NSValue *> * /*this marked with warning*/_Nonnull)pointValues //Warning:Pointer is missing a nullability type specifier (_Nonnull, _Nullable, or _Null_unspecified)
@end



//source PointsList.swift
   @objc public class PointsList : NSObject {

    var points = Array<CGPoint>()
    @objc public override init() {
        super.init()
    }
    @objc public init(withPoints points: Array<CGPoint>) {
        self.points.append(contentsOf: points)
        super.init()
    }
    @objc public init(withValues pointValues: Array<NSValue>) {
        super.init()
        pointValues.forEach { (pointValue) in
                self.points.append(pointValue.cgPointValue)
        }
    }
}

Этот файл сгенерирован Xcode из классов swift.Я вижу модификатор _Nunnull, но XCode жалуется, что я должен добавить этот модификатор.Может быть, я забыл некоторые настройки в конфигурации проекта.
Как я могу исправить это странное поведение?

UPD
У меня та же проблема с Swift 5 и Xcode 10.2.
Это странно, потому что другие файлы в моем проекте обрабатываются правильно.
Проблематолько с модификаторами _Nonnull и _Nullable.Xcode игнорирует их, если я нажимаю кнопку Fix в сообщении с предупреждением, Xcode добавляет второй указатель к указателю, и предупреждение не исчезает.

1 Ответ

0 голосов
/ 16 апреля 2019

В чистом ObjC вам действительно не нужно использовать _Nullable и _Nonnull.Это вызовы с более низким рычагом, чем nullable и nonull, которые должны быть необходимы только при выполнении C ++ (например, typedefs и блоков).

На самом деле вам никогда не придется использовать nonnull.Единственный идентификатор, который я обычно использую, это nullable.Причина этого заключается в том, что вы должны использовать NS_ASSUME_NONNULL_BEGIN/NS_ASSUME_NONNULL_END оболочки в вашем коде ObjC, не только для удобства чтения, но и для более подробных предупреждений / ошибок компилятора и лучшей совместимости Swift.

Рекомендуйте писать классы ObjC, подобные этой:

// SomeClass.h

NS_ASSUME_NONNULL_BEGIN
@interface SomeClass : NSObject
-(instancetype)initWithRequiredSomething:(NSString *)requiredString optionalSomething:(nullable NSString *)optionalString;
@end
NS_ASSUME_NONNULL_END

Возвращаемое значение и requiredString неявно nonnull и optionalString равно nullable

Попробуйте выполнить ваш проект и удалить все экземпляры _Nullable, _Nonnull и nonnull, вы можете найти это вполне удовлетворительным (и, надеюсь, решить проблему!).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...