我正在尝试使用默认方法扩展类绑定协议(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
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 {}