从解析的子字符串swift中删除字节

从解析的子字符串swift中删除字节,swift,substring,Swift,Substring,我有一个解析一些十六进制数据的函数,但是,我必须手动对数据进行子串,并将其转换为字节。以下是我所拥有的: public func parseHex(hex: String) { self.address = UInt8(hex.substring(0...4)) } 其中self.address是一个UInt8字段。我得到的错误是: 参数标签“()”与任何重载都不匹配 如何修复此问题?正如@Hamish所述,您应该使用集合扩展方法:公共func前缀(\umaxlength:Int)->

我有一个解析一些十六进制数据的函数,但是,我必须手动对数据进行子串,并将其转换为字节。以下是我所拥有的:

public func parseHex(hex: String) {
    self.address = UInt8(hex.substring(0...4))
}
其中self.address是一个UInt8字段。我得到的错误是:

参数标签“()”与任何重载都不匹配


如何修复此问题?

正如@Hamish所述,您应该使用
集合
扩展方法:
公共func前缀(\umaxlength:Int)->Self.SubSequence

func parse(hexString: String) {
    self.address = UInt8(hexString.characters.prefix(4))
}
作为替代方案,可以使用桥接到
NSString
并使用
NSRange
(但第一种情况肯定更好):


这是如何实现子字符串的?@Craz1k0ek噢,对不起,更新了我的答案,也许它能满足您的需要。如果您想让太短的字符串崩溃,您不需要桥接到
NSString
,您可以使用
String(hex.characters.prefix(2))
(或者
hex[hex.startIndex…hex.index(hex.startIndex之后)]
). 您还需要重新添加
radix:16
,将字符串解析为十六进制而不是十进制,然后打开从初始化器返回的可选值。此外,4的长度对于单个十六进制字节来说太长,除非前两个字符都是0。@Hamish完全同意,添加到答案中。我仍然认为问题不是关于解析,而是关于substrings@OlehZayats这也适用于Int(字符串,基数:16)吗?如果您想要一个
UInt8
,您肯定想要一个2个字符的十六进制字符串子字符串吗?另请参阅,以获取(最多)字符串前n个字符的简单方法。
func parse(hexString: String) {
    let hexNSString = hexString as NSString
    self.address = UInt8(hexNSString.substring(with: NSRange(location: 0, length: 4)))
}