имя недоступно: недоступно на iOS - XCode11 - PullRequest
0 голосов
/ 16 октября 2019

После обновления с XCode 10.0 до 11

Я получаю сообщение об ошибке 'имя' недоступно: недоступно на iOS

Это во время сборки для Swift 4.2 на XCode 11.0 и 11.1, я все еще могу строить, используя XCode 10

Это происходит в коде одной из внешних библиотек Objective C , которые мы использовали черезCocopods.

return [(NSNumber *)[table[state] objectForKey:[rule name]] unsignedIntegerValue];

Я могу обойти проблему, переименовав переменную name в ruleName , но я бы не стал этого делать.

Почему XCode возражает против имени переменной имени? Это Xcode, но или это то, что я могу исправить в настройках сборки

Редактировать

Конкретный модуль: NUI 0.5.5

Вмодуль NUIPShiftReduceGotoTable.m

- (NSUInteger)gotoForState:(NSUInteger)state rule:(NUIPRule *)rule
{
    return [(NSNumber *)[table[state] objectForKey:[rule name]] unsignedIntegerValue];
}

1 Ответ

1 голос
/ 24 октября 2019

Apple внесла изменение, которое может нарушить ранее скомпилированный код в Xcode 11.0 / 11.1. Ранее компилятор мог бы передать сообщение «имя» объекту, тип которого он не знает. Это может произойти по многим причинам в слабо типизированном мире Objective-C.

В настоящее время в Xcode 11.1 вы можете это сделать.

id x = nil;
[x name];

И это скомпилируется, нет проблем. Но:

NSObject *x = nil
[x name];

не будет компилироваться из-за того, что компилятор идентифицирует наиболее вероятный селектор, который является API_UNAVAILABLE в NSLayoutAnchor.h (возможно).

Если у компилятора было больше информации, он можетсопоставьте правильный селектор. Это может быть так же просто, как включение заголовка для любого свойства name в файле .m, который не работает.

Я думаю, что-то вроде в NUIPShiftReduceGotoTable.m вы добавляете строку #import "NUIPRule.h"

...