что означает эта странная нотация кода

#objective-c

#objective-c

Вопрос:

что означает эта строка при использовании второго NSDictionay рядом с телом сообщения:

NSDictionary *item = (NSDictionary *) [self.content objectAtIndex:indexPath.row];

Ответ №1:

(NSDictionary *) приведение типа. Это говорит компилятору предположить, что объект, возвращаемый objectAtIndex: методом, относится к типу NSDictionary * , даже если возвращаемый тип метода отличается.

Ответ №2:

self.content является свойством типа NSArray (я думаю!)

Эта строка возвращает вам объект (который должен быть NSDictionary ) по индексу indexPath.row . (NSDictionary*) приводит объект к NSDictionary .

Комментарии:

1. возвращаемый объект является словарем, но почему он был приведен к словарю?

2. потому что компилятор не знает, какой тип хранится в массиве

3. строки являются предопределенными словарями, поэтому он знает, какой тип данных хранится в этом массиве!

4. Приведение совершенно не нужно. Оно будет преобразовано id в NSDictionary * без приведения.

Ответ №3:

Это приведение, как в C.

В вашем случае «self.content», похоже, является NSArray. Итак, [self.content objectAtIndex:indexPath.row] был бы NSObject. За исключением того, что здесь, по какой-то причине, вы знаете, что это NSDictionary. Итак, вы явно приводите его, чтобы избежать предупреждения компилятора (которое сообщило бы вам «эй, вы присваиваете NSObject переменной NSDictionary)

Комментарии:

1. objectAtIndex: возвращает id тип, а не NSObject * тип.

2. О, действительно, вы правы. Однако это должен быть NSObject, поскольку объекты, добавленные в NSArray, сохраняются и освобождаются, и, следовательно, должны быть NSObjects.

3. Также следует отметить, что я не думаю, что присвоение идентификатора переменной заданного типа вызвало бы предупреждение.

4. Нет, это не должно быть NSObject , потому что если это NSObject, то вы не сможете объединять вызовы методов в цепочку, например, [[array objectAtIndex:4] integerValue] не будет работать, потому что integerValue это не метод NSObject , поэтому компилятор выдаст предупреждение.