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