c
是Swift中的一个Character变量,我碰巧知道它包含一个从1到9的数字。我想减少c
中存储的数字的值,这是最好的我可以提出:
c = Character(String(Int(String(c))! - 1))
这似乎令人费解。还有更好的方法吗?
答案 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
构造函数。
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"