Основной вопрос о типизации Objective-C - PullRequest
1 голос
/ 19 июня 2011

Рассмотрим следующий код:

if([obj isKindOfClass:[NSString class]])  {
   NSString *s = [(NSString *)obj stringByAppendingString:@"xyzzy"];
}

Я немного запутался здесь. Оператор if проверяет, принадлежит ли obj классу NSString. Если это так, он присваивает объект и добавленную строку NSString *s, правильно ли я понимаю? Если это так, почему вы все еще приводите его к (NSString *)? Разве оператор if уже проверяет это и не делает ли это приведение к типу ненужным?

Не было бы замечательно сказать:

NSString *s = obj stringByAppendingString:@"xyzzy"];

Заранее спасибо.

1 Ответ

3 голосов
/ 19 июня 2011

Все зависит от того, как определяется obj.Если это id obj, то приведение не требуется, но если оно было определено как NSObject *obj приведение является необходимым для подавления предупреждения компилятора о том, что stringByAppendingString: не определено в NSObject.Приведение не требуется для того, чтобы код работал во время выполнения, он только сообщает компилятору «правильный» тип, чтобы он мог определить, должен ли метод существовать в объекте.

Причина, по которой приведение не выполняетсядля id необходимо, потому что id означает «объект любого типа» , а NSObject * означает «объект типа NSObject» .

...