2016-09-19 98 views
2

设定值在我的目标C代码,我有这样的:无法通过协议

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

现在我想将其转换成快捷,所以我这样做:

if var field = view as? UITextInputTraits { 
    field.enabledReturnKeyAutomatically = true 
} 

我得到一个编译器错误,说'字段'是不可变的。什么是正确的方式来实现这一目标?

回答

0

这个问题是由Swift处理可选协议要求的特殊方式造成的。可选的协议属性没有setter。 (我认为这是该语言的一个错误。)你必须解决它。

你可以说(可怕的):

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) 
} 
+0

这可能没有什么解决问题。该视图可能是一个UITextField,或者它可能是一个UITextView。这就是为什么我试图使用它们都实现的协议,而不是具体的类。 – Gargoyle

+0

我知道。它很烂。我已经修改了我的答案以涵盖两种情况,但仍然很糟糕。提交错误报告! – matt

+0

我已经添加了第二个同样可怕的解决方案。真是一团糟。 – matt