协议扩展默认方法导致" self是不可变的"错误

时间:2017-02-05 04:42:18

标签: ios swift protocols

我正在尝试使用默认方法扩展类绑定协议(UITextInputTraits):

extension UITextInputTraits where Self: UIView {

    func setTextInputTraits() {

        self.autocapitalizationType = .none // <- compiler error
    }
}

它会出现"Cannot assign to property: 'self' is immutable"错误。

但是,如果我将约束从UIView更改为UITextField,则可以正常工作,但这会违反使用协议的目的。

为什么会出错?如何实现此默认方法?

谢谢!

  • 无法标记功能mutating,因为'mutating' isn't valid on methods in classes or class-bound protocols
  • 尝试向self,Objective-C样式发送消息,但perform不适用于非对象值参数:

    func setTextInputTraits() {
    
        let sel = #selector(setter: self.autocapitalizationType)
        self.perform(sel, with: .none)
    }
    

1 个答案:

答案 0 :(得分:3)

  

如果我将约束从UIView更改为UITextField,它可以工作,但这会破坏使用协议的目的。为什么这是一个错误?

因为UIView尚未拥有 autocapitalizationType属性。因此,编译器没有理由相信如果它 有一个,它将是可设置的。

  

如何实现此默认方法?

我想你可能会遇到这样的事情:

protocol MyTextInputTraits : UITextInputTraits {
    var autocapitalizationType: UITextAutocapitalizationType {get set}
}
extension MyTextInputTraits {
    func setTextInputTraits() {
       self.autocapitalizationType = .none
    }
}
extension UITextView : MyTextInputTraits {}
extension UITextField : MyTextInputTraits {}
extension UISearchBar : MyTextInputTraits {}