我正在尝试使用默认方法扩展类绑定协议(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
  • 尝试将消息发送为自己的Objective-C风格,但perform不适用于非对象值参数:
    func setTextInputTraits() {
    
        let sel = #selector(setter: self.autocapitalizationType)
        self.perform(sel, with: .none)
    }
    
  • 最佳答案

    如果我将约束从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 {}
    

    08-16 23:34