首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从字符串的索引中快速获取特定字符

如何从字符串的索引中快速获取特定字符
EN

Stack Overflow用户
提问于 2017-12-17 13:31:57
回答 1查看 1K关注 0票数 0

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

我遇到的问题是:

代码语言:javascript
复制
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语句时,我会得到一个运行时错误。

错误如下所示:

代码语言:javascript
复制
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)

那么,如何获得字符串的特定字符,并将其与另一个字符进行比较而不发生此崩溃呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-17 13:58:46

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

  • 索引i应该达到并排除reverse.count。这是方便地与“半开放范围”运算符(..<)。
  • ^是位xor运算符,而不是指数运算.在您的例子中,用pow()函数进行幂运算。 labelInputInt += Int(pow(2.0,Double(I) 如果基值为2,则使用“移位-左”运算符<<

因此,这将是一个可行的变体:

代码语言:javascript
复制
for i in 0 ..< reverse.count {
    let indexOfString = reverse.index(reverse.startIndex, offsetBy: i)
    if reverse[indexOfString] == "1" {
        labelInputInt += 1 << i
    }
    i += 1
}

但是您可以简单地以相反的顺序枚举字符串的字符,而不是订阅(这也是更有效的):

代码语言:javascript
复制
let binaryString = "10010"
var result = 0
for (i, char) in binaryString.reversed().enumerated() {
    if char == "1" {
        result += 1 << i
    }
}
print(result)

更简单的前向迭代,不需要reversed()<<

代码语言:javascript
复制
let binaryString = "10010"
var result = 0
for char in binaryString {
    result = 2 * result
    if char == "1" {
        result += 1
    }
}
print(result)

建议使用reduce()

代码语言:javascript
复制
let binaryString = "10010"
let result = binaryString.reduce(0) { 2 * $0 + ($1 == "1" ? 1 : 0) }
print(result)

但为什么要重新发明方向盘?只需使用Swift标准库中的init?(_:radix:) (免费进行错误检查):

代码语言:javascript
复制
let binaryString = "10010"
if let result = Int(binaryString, radix: 2) {
    print(result)
} else {
    print("invalid input")
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47855639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档