作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
现在这是 Swift 编译器的一种奇怪行为。我得到一个 Cannot assign to property 'self' is immutable
类中的编译时错误。这是最小的游乐场代码:
import UIKit
open class TextInputTraitsWrapper: NSObject {
private var wrapped: UITextInputTraits
public init(wrapped: UITextDocumentProxy) {
self.wrapped = wrapped
super.init()
}
open var keyboardAppearance: UIKeyboardAppearance {
get {
return wrapped.keyboardAppearance ?? UIKeyboardAppearance.default
}
set {
wrapped.keyboardAppearance = newValue // ERROR ON THIS LINE
}
}
}
这是我得到的错误(这是完整的程序):
UITextInputTraits
定义
keyboardAppearance
像这样:
optional var keyboardType: UIKeyboardType { get set }
.
最佳答案
这是一个错误,但不是您可能认为的错误(并且错误消息根本没有帮助)。这是一个 known bug由于 keyboardAppearance
UITextInputTraits 协议(protocol)的属性是 optional
属性(意味着它可能不会被实现)。这是一个 Objective C 特性,而不是 Swift 特性,并且错误是这些属性在 Swift 中不能直接设置,即使它们被标记为 {get set}
.
为了看到这一点,让我们为自己模拟相同的模式:
@objc public protocol P {
@objc optional var keyboardAppearance : NSString {get set}
}
open class C : NSObject {
private var wrapped: P
public init(wrapped: P) {
self.wrapped = wrapped
super.init()
}
open var keyboardAppearance : NSString {
get {
wrapped.keyboardAppearance ?? "" as NSString
}
set {
wrapped.keyboardAppearance = newValue
}
}
}
我们得到同样的错误。但是如果删除关键字
optional
,错误消失。这证明
optional
是导致问题的原因。但是你不能删除
optional
在您的情况下,因为该协议(protocol)不属于您。
let kp = \C.wrapped.keyboardAppearance
self[keyPath:kp] = newValue
关于swift - Unexpected Cannot assign to property 'self' is immutable compile time error IN CLASS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66082736/
我是一名优秀的程序员,十分优秀!