大家好,我收到了这段代码,XCode警告我“使用UITextField类型的表达式初始化NSString * __ strong的不兼容指针类型”。
NSString *name = (UITextField *)searchText.text;
但是这个很好
NSString *name2 = [(UITextField *)searchText text];
这个也很好
NSString *name3 = [(UITextField *)searchText.text mutableCopy];
我有两个问题:
obj.*
和[obj *]
我不知道如何在Apple开发人员文档中搜索这些问题;请帮忙。
答案 0 :(得分:8)
在第一个版本中,由于运算符优先级,您将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];
答案 1 :(得分:1)
在第二个和第三个例子中,强制转换只对searchText进行操作。因此,您将向UITextField对象发送消息。
在第一个中,强制转换适用于整个searchText.text。将UITextField对象分配给NSString变量不是您想要的。您正在寻找的代码是:
NSString *name = ((UITextField *)searchText).text;
mutableCopy消息将字符串的副本作为NSMutableString对象返回,当NSMutableString派生自NSMtringString对象时,可以将其分配给NSString。在这种情况下,使用“复制”消息也一样好。
希望有所帮助。