swift - 如何从swift中的字符串索引中获取特定字符

标签 swift string character swift4

我正在尝试使用 Swift 4 为 Apple Watch 构建二进制到十进制计算器。

我遇到问题的代码是这样的:

var i = 0
var labelInputInt = 0
let labelOutputString = "10010" // Random number in binary 
let reverse = String(labelOutputString.reversed()) // Reversing the original string

while i <= reverse.count {
    let indexOfString = reverse.index(reverse.startIndex, offsetBy: i)

    if reverse[indexOfString] == "1" {
        labelInputInt += 2^i * 1
    }

    i += 1
}

我正在使用 while 循环获取索引 indexOfString 并检查字符串 reverse 中特定索引处是否等于“1”。

问题是在执行 if 语句时出现运行时错误。

错误看起来像这样:

2  libpthread.so.0 0x00007fc22f163390
3  libswiftCore.so 0x00007fc22afa88a0 _T0s18_fatalErrorMessages5NeverOs12Stati
cStringV_A2E4fileSu4lines6UInt32V5flagstFTfq4nnddn_n + 96
4  libswiftCore.so 0x00007fc22afb3323
5  libswiftCore.so 0x00007fc22afdf9a2
6  libswiftCore.so 0x00007fc22aedca19 _T0SS9subscripts9CharacterVSS5IndexVcfg 
+ 9
7  libswiftCore.so 0x00007fc22f591294 _T0SS9subscripts9CharacterVSS5IndexVcfg 
+ 74139780
8  swift           0x0000000000f2925f
9  swift           0x0000000000f2d402
10 swift           0x00000000004bf516
11 swift           0x00000000004ae461
12 swift           0x00000000004aa411
13 swift           0x0000000000465424
14 libc.so.6       0x00007fc22d88d830 __libc_start_main + 240
15 swift           0x0000000000462ce9
Stack dump:
0.    Program arguments: /home/drkameleon/swift4/usr/bin/swift -frontend -inte
rpret tmp/XfwP0oM7FJ.swift -disable-objc-interop -suppress-warnings -module-na
me XfwP0oM7FJ 
Illegal instruction (core dumped)

那么,我怎样才能获取字符串的特定字符并将其与另一个字符进行比较而不发生此崩溃?

最佳答案

您从字符串中获取特定字符的方法实际上是正确的,您的代码中还有另外两个问题:

  • 索引i应该达到并排除 reverse.count . 这可以通过“半开范围”运算符 ( ..< ) 方便地完成。
  • ^是按位异或运算符,而不是取幂。求幂是用 pow() 完成的功能,在你的情况下

    labelInputInt += Int(pow(2.0, Double(i)))
    

    或使用“左移”运算符 <<如果基数是 2。

所以这将是一个可行的变体:

for i in 0 ..< reverse.count {
    let indexOfString = reverse.index(reverse.startIndex, offsetBy: i)
    if reverse[indexOfString] == "1" {
        labelInputInt += 1 << i
    }
    i += 1
}

但您可以简单地枚举字符串中的字符以相反的顺序代替下标(这也更有效):

let binaryString = "10010"
var result = 0
for (i, char) in binaryString.reversed().enumerated() {
    if char == "1" {
        result += 1 << i
    }
}
print(result)

前向迭代更简单,没有 reversed()<<需要:

let binaryString = "10010"
var result = 0
for char in binaryString {
    result = 2 * result
    if char == "1" {
        result += 1
    }
}
print(result)

建议使用 reduce() :

let binaryString = "10010"
let result = binaryString.reduce(0) { 2 * $0 + ($1 == "1" ? 1 : 0) }
print(result)

但为什么要重新发明轮子?只需使用 init?(_:radix:) 来自 Swift 标准库(免费错误检查):

let binaryString = "10010"
if let result = Int(binaryString, radix: 2) {
    print(result)
} else {
    print("invalid input")
}

关于swift - 如何从swift中的字符串索引中获取特定字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47855639/

相关文章:

ios - 如何确认 ref.removeAllObservers() 已完成?

swift - 使用 Facebook 登录时出错

ios - 函数签名特化在 swift 中崩溃

C++ 将字符串与单词进行比较

java - Android:查找字符串中的特定字符

c++ - 在 C++ 中比较 char 数组表中的项目

ios - 从 iOS 应用程序将视频上​​传到 youtube 返回 400

string - 如何从日期字符变量中删除时间字段字符串?

javascript - 将字符串格式的数组转换为 JavaScript 数组

c# - 如何将 ' 字符表示为字 rune 字