gpt4 book ai didi

ios - 导致 "self is immutable"错误的协议(protocol)扩展默认方法

转载 作者:搜寻专家 更新时间:2023-10-31 22:28:46 24 4
gpt4 key购买 nike

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

extension UITextInputTraits where Self: UIView {

func setTextInputTraits() {

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

它给出了一个 “无法分配给属性:'self' 是不可变的” 错误。

如果我将约束从 UIView 更改为 UITextField,它会起作用,但这违背了使用协议(protocol)的目的。

为什么会报错?我怎样才能实现这个默认方法?

谢谢!


  • 不能标记 func mutating,因为 'mutating' 对类或类绑定(bind)协议(protocol)中的方法无效
  • 尝试向自己发送消息,Objective-C 风格,但 perform 不适用于非对象值参数:

    func setTextInputTraits() {

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

最佳答案

It works if I change the constraint from UIView to UITextField though, but that defeats the purpose of using protocols. Why is it an error?

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

How can I achieve implementing this default method?

我想你可能在寻找这样的东西:

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

关于ios - 导致 "self is immutable"错误的协议(protocol)扩展默认方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42048615/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com