В первой версии, из-за приоритета оператора, вы переводите searchText.text
в UITextField*
, то, что вы хотите сделать, это, вероятно, приведение searchText
;
NSString *name = ((UITextField *)searchText).text;
Во второй версии у вас нет точки, поэтому компилятор понимает, что ваше преобразование преобразует searchText в UITextField
, и отправляет ему текстовое сообщение. Другими словами, совершенно верно.
Последний случай немного сложен, поскольку включает в себя как время выполнения, так и время компиляции. Как я понимаю;
- Вы разыгрываете
searchText.text
на UITextField*
. Среда выполнения все еще знает, что объект является строкой NSString, и сообщение mutableCopy
, которое существует в обоих случаях, в любом случае перейдет к правильному методу [NSString mutableCopy] и создаст / вернет изменяемую копию NSString, поэтому среда выполнения работает нормально.
- Поскольку
mutableCopy
возвращает id
(ссылаясь на NSMutableString), компилятор в порядке присваивает NSString (id может быть назначен чему угодно), поэтому время компиляции в порядке.
Вопрос, что такое searchText
изначально? Последняя версия, скомпилированная без предупреждения, указывает, что это уже UITextField*
или, по крайней мере, тип, который может принимать сообщение text
. Если это так, вы должны просто сделать;
NSString *name3 = [searchText.text mutableCopy];