在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
答案 0 :(得分:1)
阅读rintaro的回答并考虑我的评论,我认为你错误地放置了setter中的第一张支票,看起来它属于吸气剂而是:
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不依赖于现有值。
答案 1 :(得分:0)
错误在于:
set {
if (bytes[15] == 8 && bytes[16] == 0) {
return nil // <--- HERE
}
您无法从set { }
返回任何内容。如果你想打破,只需改为return
。
set {
if (bytes[15] == 8 && bytes[16] == 0) {
return
}