属性设置器中的NilLiteralConvertible

时间:2015-02-12 20:39:35

标签: swift properties

在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

2 个答案:

答案 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
    }