Точечная запись Obj-c для чтения свойств: почему я не могу объединить это так? - PullRequest
2 голосов
/ 19 апреля 2011

У меня есть эта строка кода:

[[[EntitlementsManager instance] entitlements] objectAtIndex:indexPath.row];

Почему это не работает следующим образом:

[EntitlementsManager.instance.entitlements objectAtIndex:indexPath.row];

Похоже, это должно работать для меня? Я немного запутался, почему он не компилируется.

FYI, EntitlementsManager, 'instance' - это метод '+', чтобы вернуть его синглтон, а 'rightlements' - свойство NSArray.

-edit: Для тех, кто говорит, что он не работает, потому что «instance» - это статический метод «+», тогда почему следующее работает просто отлично? Я действительно заинтригован:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return EntitlementsManager.instance.entitlements.count;
}

-edit2: работает , как ни странно:

... = [[EntitlementsManager instance].entitlements objectAtIndex:indexPath.row];

Ответы [ 2 ]

1 голос
/ 19 апреля 2011

Возможно, анализатор запутался, когда увидел Тип , появляющийся слева от . внутри вызова метода Obj-C.Например, если грамматика

'[' Type   methodAndArguments ']'

существует, то она будет проанализирована перед распознаванием a '.' b, и, поскольку .instance ... не является ожидаемой конструкцией methodAndArguments , компиляторне удастся.Поскольку Type.method не является ожидаемым использованием точечного синтаксиса, он допустим для компилятора , а не для его поддержки или даже для использования в будущем синтаксической ошибки.

Либо всегда используйте скобочные обозначения для методов класса, как вы ожидаете:

[[EntitlementsManager instance].entitlements objectAtIndex:0]

, либо переместите это выражение за скобки:

NSArray* entitlements = EntitlementsManager.instance.entitlements;
[entitlements objectAtIndex:0];

, либо '[' Type methodAndArguments ']' не заставляйтебыть сопоставленным:

[(nil, EntitlementsManager.instance.entitlements) objectAtIndex:0]
1 голос
/ 19 апреля 2011

Попробуйте вот так

[(EntitlementsManager.instance.entitlements) objectAtIndex: indexPath.row];

может работать

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