Я бы сделал что-то вроде этого, он может быть не таким изящным, как работа с «указателями», но он хорошо справляется с работой, это в значительной степени связано с рядом новых +=
операторов для String
, таких как:
@infix func += (inout lhs: String, rhs: (unit1: UInt8)) {
lhs += Character(UnicodeScalar(UInt32(rhs.unit1)))
}
@infix func += (inout lhs: String, rhs: (unit1: UInt8, unit2: UInt8)) {
lhs += Character(UnicodeScalar(UInt32(rhs.unit1) << 8 | UInt32(rhs.unit2)))
}
@infix func += (inout lhs: String, rhs: (unit1: UInt8, unit2: UInt8, unit3: UInt8, unit4: UInt8)) {
lhs += Character(UnicodeScalar(UInt32(rhs.unit1) << 24 | UInt32(rhs.unit2) << 16 | UInt32(rhs.unit3) << 8 | UInt32(rhs.unit4)))
}
ПРИМЕЧАНИЕ. Вы можете расширить список поддерживаемых операторов с помощью переопределения оператора +
, определяя список полностью коммутативных операторов для String
.
, и теперь вы можете добавить String
с символом unicode (UTF-8, UTF-16 или UTF-32) например:
var string: String = "signs of the Zodiac: "
string += (0x0, 0x0, 0x26, 0x4b)
string += (38)
string += (0x26, 76)