objective-c - objective-c 中使用点符号的内联类型转换

标签 objective-c xcode

这个问题纯属好奇。

在 Xcode 中,为什么会这样:

if (view.class == [UITextView class]) {
    UITextView *tview = (UITextView *)view;
    tview.textColor = [UIColor colorWithRed:0.020 green:0.549 blue:0.961 alpha:1.];
}

但以下结果会导致错误消息 Property 'textColor' not found on object of type 'UIView *':

if (view.class == [UITextView class]) {
    (UITextView *)view.textColor = [UIColor colorWithRed:0.020 green:0.549 blue:0.961 alpha:1.];
}

直觉上,这些应该完成完全相同的事情。

但是如果我将内联转换括在括号中,它就可以正常工作:

if (view.class == [UITextView class]) {
    ((UITextView *)view).textColor = [UIColor colorWithRed:0.020 green:0.549 blue:0.961 alpha:1.];
}

我怀疑这与 C 处理操作顺序的方式有关,但我很想听听解释。谢谢!

最佳答案

if (view.class == [UITextView class]) {
    (UITextView *)view.textColor = [UIColor colorWithRed:0.020 green:0.549 blue:0.961 alpha:1.];
}

由于优先顺序,(UITextView*) 将充当 view.textColor 结果的转换,即 .textColor 将首先在 UIView* 中访问,然后再转换为 UITextView*

if (view.class == [UITextView class]) {
    ((UITextView *)view).textColor = [UIColor colorWithRed:0.020 green:0.549 blue:0.961 alpha:1.];
}

在此,额外的括号将通知编译器需要先计算子表达式,然后再计算其余表达式。因此,这会将 view 转换为 UITextView*。该表达式的副作用是一个 UITextView* 实例,这意味着 .textColor 属性可以在它所针对的实例上找到。

关于objective-c - objective-c 中使用点符号的内联类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13094412/

相关文章:

iphone - 应用程序未手动启动

objective-c - 有什么方法可以确保 GCD 任务在没有串行队列的情况下按顺序完成?

objective-c - 如何在 Interface Builder 中使用结构中的值

ios - 将对象附加到控件以指示 UITableView 中的状态

ios - View Controller 之间的一类实例化快速共享

ios 从 appdelegate 启动登录并从登录推送 uitabbarcontroller

iphone - 从 ABRecordCopyValue 声明 NSString 时内存泄漏

ios - 是否可以从设备 GPS 中检索 GPRMC?

iphone - 如何检查 objective-c 中的变量是否每秒或更少发生变化?

iphone - 从 iPhone 获取文件