Это ошибка в интерфейсе GCC 4.2, также воспроизводимая в LLVM-GCC 4.2.Поздравляем!У этих компиляторов возникают проблемы при назначении свойств с использованием точечного синтаксиса, когда присваиваемое значение является выражением, полученным из условного оператора.
Следующий код воспроизводит проблему и показывает два решения исходного кода: одно, как вы заметили,, это использовать временную переменную.Другое решение состоит в том, чтобы использовать традиционный синтаксис отправки сообщений Objective C вместо точечного синтаксиса:
#import <Foundation/Foundation.h>
CGRect CGRectFromString(NSString *string);
@interface SomeClass : NSObject
@property (nonatomic, assign) CGRect frame;
@end
@implementation SomeClass
@synthesize frame;
@end
int main(void) {
NSDictionary *info;
SomeClass *interaction;
NSString *kInteractionFrameKey;
CGRect rect;
rect = [info objectForKey:kInteractionFrameKey] ? CGRectFromString([info objectForKey:kInteractionFrameKey]) : CGRectZero;
interaction.frame = rect;
[interaction setFrame:([info objectForKey:kInteractionFrameKey] ? CGRectFromString([info objectForKey:kInteractionFrameKey]) : CGRectZero)];
interaction.frame = ([info objectForKey:kInteractionFrameKey] ? CGRectFromString([info objectForKey:kInteractionFrameKey]) : CGRectZero);
interaction.frame = ([info objectForKey:kInteractionFrameKey] ? CGRectZero : CGRectFromString([info objectForKey:kInteractionFrameKey]));
interaction.frame = ([info objectForKey:kInteractionFrameKey] ? CGRectZero : CGRectZero);
return 0;
}
Тестирование с различными компиляторами дает следующее:
$ llvm-gcc -c test.m
test.m: In function ‘main’:
test.m:24: error: assignment of read-only variable ‘prop.76’
test.m:25: error: assignment of read-only variable ‘prop.77’
test.m:26: error: assignment of read-only variable ‘prop.78’
$ clang -c test.m
$
Вы можете использовать LLVM илиИзбегайте точечного синтаксиса в этом конкретном случае.Возможно, вы захотите сообщить об ошибке, но я не задерживаю дыхание, поскольку Apple вряд ли обновит GCC.