Objective c 无法通过协议设置值

Objective c 无法通过协议设置值,objective-c,swift,swift3,Objective C,Swift,Swift3,在我的目标C代码中,我有: if ([view conformsToProtocol:@protocol(UITextInputTraits)]) { id<UITextInputTraits> field = view; field.enablesReturnKeyAutomatically = YES; } 我得到一个编译器错误,说“field”是不可变的。实现这一点的正确方法是什么?这个问题是由Swift处理《任择议定书》要求的独特方式造成的。可选协议属性没

在我的目标C代码中,我有:

if ([view conformsToProtocol:@protocol(UITextInputTraits)]) {
    id<UITextInputTraits> field = view;
    field.enablesReturnKeyAutomatically = YES;
}


我得到一个编译器错误,说“field”是不可变的。实现这一点的正确方法是什么?

这个问题是由Swift处理《任择议定书》要求的独特方式造成的。可选协议属性没有setter。(我认为这是语言中的一个bug。)你必须解决它

你可以说(可怕):

另一种方式(同样可怕):


但这并不能解决问题。该视图可能是UITextField,也可能是UITextView。这就是为什么我试图使用它们都实现的协议,而不是具体的类。我知道。真糟糕。我已经修改了我的答案以涵盖这两种情况,但仍然很糟糕。提交错误报告!我添加了第二个同样可怕的解决方案。真是一团糟。请提交一份错误报告,并参考2015年2月提交的19730251。协议的可选属性没有Swift设置程序。
switch view {
case let field as UITextField:
    field.enablesReturnKeyAutomatically = true
case let field as UITextView:
    field.enablesReturnKeyAutomatically = true
default: break
}
let setter = #selector(setter:UITextInputTraits.enablesReturnKeyAutomatically)
if view.responds(to:setter) {
    view.perform(setter, with: 1 as NSNumber)
}