协议扩展默认方法导致“self为不可变”错误

6
我正在尝试通过添加一个默认方法来扩展一个类绑定的协议(UITextInputTraits):
extension UITextInputTraits where Self: UIView {

    func setTextInputTraits() {

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

它会报错:"Cannot assign to property: 'self' is immutable"

如果我将约束从UIView更改为UITextField,它就可以正常工作,但这违背了使用协议的目的。

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

谢谢!


  • cannot mark the func mutating, since 'mutating' isn't valid on methods in classes or class-bound protocols
  • tried sending messages to self, Objective-C style, but perform does not work with non-object value arguments:

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

2
如果我将约束从UIView更改为UITextField,它会起作用,但这违背了使用协议的目的。为什么会出现错误?
因为UIView没有自动大写类型属性。因此,编译器没有理由相信,如果有一个自动大写类型属性,它就可以被设置。
如何实现此默认方法?
我认为您可能需要类似于以下内容:
protocol MyTextInputTraits : UITextInputTraits {
    var autocapitalizationType: UITextAutocapitalizationType {get set}
}
extension MyTextInputTraits {
    func setTextInputTraits() {
       self.autocapitalizationType = .none
    }
}
extension UITextView : MyTextInputTraits {}
extension UITextField : MyTextInputTraits {}
extension UISearchBar : MyTextInputTraits {}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接