4

这个问题纯属好奇。

在 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 如何处理操作顺序有关,但我很想听听解释。谢谢!

4

2 回答 2

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

由于优先顺序,(UITextView*)将作为 的结果的强制转换view.textColor,含义.textColorUIView*在它被强制转换为之前的第一个访问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可以在它所针对的实例上找到该属性。

于 2012-10-26T21:15:01.633 回答
0

我对我的模型使用了相同的方法,封装到每个实体的类型转换辅助函数中。

// Cast an `entity` to a `user`.
TPUser *user(TPEntity *entity)
{ return ([entity isKindOfClass:[TPUser class]]) ? (TPUser*)entity : nil; }

所以像这样使用是安全的......

someUI.text = user(entity).name;

...因为它nil在投射失败时返回。


对于这种情况,它类似于:

UITextField *textField(UIView *view)
{ return ([view isKindOfClass:[UITextField class]]) ? (UITextField*)view : nil; }
于 2014-01-22T18:59:55.833 回答