属性 setter 中的 NilLiteralConvertible
NilLiteralConvertible in Property setter
在 swift 我有这个:
///3.5.1.8 Range is ± 32,576 FPM, FPM of 32640 means max. Also can be invalid (nil)
var vVelcotiy: Int? {
get {
let ret : Int16 = decode12Bit2sCompliment(bytes[15], bytes[16], useEntireFirstByte: false)
return Int(ret * 64);
}
set {
if (bytes[15] == 8 && bytes[16] == 0) {
return nil
}
if let n = newValue {
let nv = n / 64
bytes[15] = (bytes[15] & 0xF0) | (UInt8(nv) >> 8)
bytes[16] = UInt8(nv)
} else {
bytes[15] = (bytes[15] & 0xF0) | 0xF8
bytes[16] = 0x00
}
}
}
我收到 type '()' does not conform to protocol 'NilLiteralConvertible'
错误,但我已将 属性 声明为可选,所以我很困惑。
我希望能够做到:
var a : vVelocity = nil
错误在这里:
set {
if (bytes[15] == 8 && bytes[16] == 0) {
return nil // <--- HERE
}
您不能 return 来自 set { }
的任何内容。如果你想打破,只需return
代替。
set {
if (bytes[15] == 8 && bytes[16] == 0) {
return
}
阅读 rintaro 的回答并考虑我的评论后,我认为您在 setter 中放错了第一张支票,它看起来应该属于 getter:
var vVelcotiy: Int? {
get {
if (bytes[15] == 8 && bytes[16] == 0) {
return nil
}
let ret : Int16 = decode12Bit2sCompliment(bytes[15], bytes[16], useEntireFirstByte: false)
return Int(ret * 64);
}
set {
if let n = newValue {
let nv = n / 64
bytes[15] = (bytes[15] & 0xF0) | (UInt8(nv) >> 8)
bytes[16] = UInt8(nv)
} else {
bytes[15] = (bytes[15] & 0xF0) | 0xF8
bytes[16] = 0x00
}
}
}
现在你的 getter 有可能返回 nil,而你的 setter 不依赖于现有值。
在 swift 我有这个:
///3.5.1.8 Range is ± 32,576 FPM, FPM of 32640 means max. Also can be invalid (nil)
var vVelcotiy: Int? {
get {
let ret : Int16 = decode12Bit2sCompliment(bytes[15], bytes[16], useEntireFirstByte: false)
return Int(ret * 64);
}
set {
if (bytes[15] == 8 && bytes[16] == 0) {
return nil
}
if let n = newValue {
let nv = n / 64
bytes[15] = (bytes[15] & 0xF0) | (UInt8(nv) >> 8)
bytes[16] = UInt8(nv)
} else {
bytes[15] = (bytes[15] & 0xF0) | 0xF8
bytes[16] = 0x00
}
}
}
我收到 type '()' does not conform to protocol 'NilLiteralConvertible'
错误,但我已将 属性 声明为可选,所以我很困惑。
我希望能够做到:
var a : vVelocity = nil
错误在这里:
set {
if (bytes[15] == 8 && bytes[16] == 0) {
return nil // <--- HERE
}
您不能 return 来自 set { }
的任何内容。如果你想打破,只需return
代替。
set {
if (bytes[15] == 8 && bytes[16] == 0) {
return
}
阅读 rintaro 的回答并考虑我的评论后,我认为您在 setter 中放错了第一张支票,它看起来应该属于 getter:
var vVelcotiy: Int? {
get {
if (bytes[15] == 8 && bytes[16] == 0) {
return nil
}
let ret : Int16 = decode12Bit2sCompliment(bytes[15], bytes[16], useEntireFirstByte: false)
return Int(ret * 64);
}
set {
if let n = newValue {
let nv = n / 64
bytes[15] = (bytes[15] & 0xF0) | (UInt8(nv) >> 8)
bytes[16] = UInt8(nv)
} else {
bytes[15] = (bytes[15] & 0xF0) | 0xF8
bytes[16] = 0x00
}
}
}
现在你的 getter 有可能返回 nil,而你的 setter 不依赖于现有值。