属性 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 不依赖于现有值。