Swift字符串转16进制+字符串过滤

本文介绍了使用Swift进行不同类型数据转换的方法,包括Int到16进制或8进制字符串、单个字节到整数、十六进制字符串到整数等,并提供了去除字符串中特定字符或字符集的示例。

原创Blog,转载请注明出处

今天用swfit写项目的时候遇到了转换的问题,贴出来,给需要的人

一、Int转16进制或者8进制字符串

var hexStr = String().stringByAppendingFormat("%x",16) //hexStr = "10"
var octStr = String().stringByAppendingFormat("%o",16) //hexStr = "20"

二、单个字节转换成为整数
例如:"c"转换成99(十进制)
var test = "c"
var nsstrTest:NSString = test
var result = nsstrTest.UTF8String[0] //result = 99

三、十六进制字符串转整数
var hexString = "2b"
var result:UInt32 = 0
NSScanner.scannerWithString(hexString).scanHexInt(&result)//result = 43

四、过滤掉一个字符
比如过滤掉空白
var test = "123 456 7 8 9"
var result = test.stringByReplacingOccurrencesOfString(" ",withString:"",options:NSStringCompareOptions.LiteralSearch,range:nil)//testresult = "123456789"


五、过滤掉一个字符集
var doNotWant = NSCharacterSet(charactersInString:"-<>")
var test = "<123-456-789>"
var result = join("",test.componentsSeparatedByCharactersInSet(doNotWant))


<think>好的,我现在需要帮助用户解决在Swift中将字符串换为UInt64的问题。首先,我得回想一下用户之前的问题和当前的疑问。用户之前询问了关于@objc错误的问题,现在向类型换,特别是字符串UInt64。这可能意味着他们在处理数据解析或与需要无符号整数的API交互时遇到了问题。 用户的需求很明确,但需要确保换的安全性和有效性。我需要考虑几种可能的换方法,并评估它们的优缺点。首先,Swift中常用的换方式是使用UInt64的构造函数,直接传入字符串。但需要注意,这种方式可能返回可选值,因为字符串可能无法正确解析为数字。 接下来,可能需要提到处理不同进制的情况,比如十六进制或二进制。用户可能有这样的需求,特别是如果他们处理的是来自外部系统的数据,这些数据可能不是十进制的。这时候需要介绍带有radix参数的初始化方法。 然后,异常处理也是一个重点。用户需要知道如何处理无效输入,避免程序崩溃。可选绑定和guard语句是比较常见的方法,可以确保在换失败时提供默认值或错误处理。 另外,用户可能不知道字符串中的空格或特殊字符会影响换结果,需要提醒他们先清理字符串,比如去除空格或其他非数字字符。例如,使用trimmingCharacters方法去除空白符。 我还需要考虑Swift的版本兼容性,不过UInt64的初始化方法在较新的Swift版本中应该都是支持的。但可能需要提到在旧版本中是否有不同的处理方式,不过现在大多数情况下可以不用考虑,除非用户有特殊环境。 此外,用户可能关心性能问题,但在这个问题上,换的开销通常不大,所以可能不需要深入讨论。但如果有大量数据需要换,可能需要考虑优化,比如使用Scanner或更高效的方法,不过通常标准方法已经足够。 最后,总结几种方法,给出示例代码,并说明每种方法的适用场景。确保用户能够根据具体情况选择最合适的换方式。例如,直接换适用于十进制,处理可选值使用guard或if let,进制换时指定radix,以及预处理字符串的方法。 需要检查是否有遗漏的情况,比如字符串包含正负号,但UInt64是无符号的,所以负号会导致换失败,这点需要提醒用户。另外,溢出问题,如果字符串表示的数值超过了UInt64的最大值,换也会失败,所以需要处理大数情况。 可能还需要提到错误信息的输出,帮助调试,比如在换失败时打印具体的错误原因,但Swift的初始化方法本身不提供详细错误信息,所以可能需要自定义错误处理。 总之,我需要将换方法分步骤讲解,确保清晰易懂,提供代码示例,并覆盖常见的处理场景和注意事项,帮助用户全面理解和解决问题。</think>在 Swift 中将字符串换为 `UInt64` 类型时,需要注意数值的有效性和换安全性。以下是分步说明和解决方案: --- ### **1. 基础换方法** 使用 `UInt64` 的构造函数直接换,但必须处理可能失败的**可选值**: ```swift let str = "18446744073709551615" // UInt64 最大值 if let number = UInt64(str) { print("换成功: \(number)") } else { print("无效格式或超出范围") } ``` --- ### **2. 处理不同进制** 通过 `radix` 参数支持二进制(2)、八进制(8)、十进制(10)、十六进制16)等: ```swift let hexStr = "1a3f" // 十六进制 if let number = UInt64(hexStr, radix: 16) { print("十六进制换结果: \(number)") // 输出 6719 } let binaryStr = "1101" if let number = UInt64(binaryStr, radix: 2) { print("二进制换结果: \(number)") // 输出 13 } ``` --- ### **3. 安全换技巧** #### **场景1:提供默认值** ```swift let str = "42" let number = UInt64(str) ?? 0 // 换失败时默认为 0 ``` #### **场景2:严格校验** ```swift guard let number = UInt64(str) else { fatalError("无法换为 UInt64: \(str)") } ``` --- ### **4. 处理特殊字符** 如果字符串包含空格或非数字字符,需先清理: ```swift let dirtyStr = " 123_abc " let cleanStr = dirtyStr .trimmingCharacters(in: .whitespaces) // 去空格 .components(separatedBy: CharacterSet.decimalDigits.inverted) // 去除非数字 .joined() if let number = UInt64(cleanStr) { print("清理后换结果: \(number)") // 输出 123 } ``` --- ### **5. 常见错误类型** | 错误场景 | 示例字符串 | 原因 | |-------------------------|---------------------|--------------------------| | 包含非数字字符 | `"123a"` | 非十进制字符 | | 负数值 | `"-42"` | `UInt64` 不支持负数 | | 超出数值范围 | `"18446744073709551616"` | 超过 `UInt64.max` (2^64-1) | | 空字符串 | `""` | 无有效内容 | --- ### **6. 扩展应用** #### **从用户输入中安全读取** ```swift func readUInt64FromInput() -> UInt64? { print("请输入一个正整数:") guard let input = readLine() else { return nil } return UInt64(input) } ``` #### **与 Foundation 框架交互** ```swift import Foundation let nsString: NSString = "987654321" let number = nsString.longLongValue // 返回 Int64 if number >= 0 { let uNumber = UInt64(number) } ``` --- ### **总结** - 优先使用 `UInt64.init?(_:)` 或带 `radix` 的构造函数 - 始终处理可选值(`if let`/`guard let`/`??`) - 清理字符串中的干扰字符 - 注意 `UInt64` 的范围:`0...18,446,744,073,709,551,615`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值