如何减少包含数字的字符?

时间:2016-02-18 18:34:40

标签: swift character

c是Swift中的一个Character变量,我碰巧知道它包含一个从1到9的数字。我想减少c中存储的数字的值,这是最好的我可以提出:

c = Character(String(Int(String(c))! - 1))

这似乎令人费解。还有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

这听起来像是UnicodeScalar

的完美用法
let scalar = UnicodeScalar("8")
let char = Character(UnicodeScalar(scalar.value-1)) // "7"

或者,从字符变量中更详细地说:

let c = Character("8")
let str = String(c)
if let scalar = str.unicodeScalars.first {
    let char = Character(UnicodeScalar(scalar.value-1)) // "7"
}

这非常混乱,因为我们必须将Character转换为String,然后转换为UnicodeScalar,然后转换回Character。我将继续努力寻求更好的解决方案。

我已经弄清楚为什么UnicodeScalar构造函数可以使用String文字。

_NSSimpleObjCType有一个私有初始值设定项(符合UnicodeScalar),它接受字符串的第一个字符并将其传递给rawValue构造函数。

NSObjCRuntime.swift

extension _NSSimpleObjCType {
    init?(_ v: UInt8) {
        self.init(rawValue: UnicodeScalar(v))
    }

    init?(_ v: String?) {
        if let rawValue = v?.unicodeScalars.first {
            self.init(rawValue: rawValue)
        } else {
            return nil
        }
    }
}

答案 1 :(得分:0)

您可以按照以下方式创建扩展程序:

extension Character {
    var integerValue: Int {
        return Int(String(self)) ?? 0
    }
    var predecessor: Character {
        return integerValue.predecessor() < 0  ? "0" : String(integerValue.predecessor()).characters.first!
    }
}

var c: Character = "9"
c = c.predecessor  
print(c)  // "8"