如何在 SwiftUI 中获取字符串索引?

Posted

技术标签:

【中文标题】如何在 SwiftUI 中获取字符串索引?【英文标题】:How to get String Index in SwiftUI? 【发布时间】:2021-12-27 17:49:49 【问题描述】:

我正在开发一个需要读取一串数字的应用程序。

我有一系列要读取数字的标签,我需要它们来显示它。

但是,我不知道如何在 SwiftUI 中读取字符串的索引

我已经看到了这个通过做 swift 完成

let input = "Blah"
let char = input[3]

extension StringProtocol 
    subscript(offset: Int) -> Character 
        self[index(startIndex, offsetBy: offset)]
    

我想要达到的就是这个。

@State var id = "12345"
@State var label1 = id[0]
@State var label2 = id[1]
etc

我知道字符串不是数组,但我试图基本上以这种方式得到它。 ID 来自文本输入。

【问题讨论】:

label1label2 似乎不太可能是 @State 变量——它们应该是计算属性。 你是对的,但我正在硬编码一些状态变量来测试我在做什么。 在这种情况下,您应该能够在计算属性中使用您的extension StringProtocol subscript。你试过了吗? 我做到了,我无法让它工作。 你能在minimal reproducible example中展示你的尝试吗? 【参考方案1】:

您使角色偏移的方法很聪明并且效果很好。这是一个使用示例:

import SwiftUI

@main
struct TestApp: App 
    var body: some Scene 
        WindowGroup 
            ContentView()
        
    


extension StringProtocol 
    subscript(offset: Int) -> Character 
        self[index(startIndex, offsetBy: offset)]
    


struct ContentView: View 
    @State var id: String = "12345"
    @State var label1: Character = Character(" ")
    @State var label2: Character = Character(" ")
    
    var body: some View 
        VStack 
            Text("id: " + id)
            Text("label1: " + String(label1))
            Text("label2: " + String(label2))
        
        .onAppear 
            label1 = id[0]
            label2 = id[1]
        
    

【讨论】:

好的。只要提供了字符串,它就可以工作。如果我想从文本输入中读取字符串怎么办。当字符串为空时,它会在扩展上引发错误。 我会在一个新问题中问它。因为这回答了我所需要的。谢谢!【参考方案2】:

你不能像那样访问id,因为它还没有设置。

改为使用您自己的初始化程序:

@State var id: String
@State var label1: Character
@State var label2: Character

/* ... */

init(id: String) 
    self.id = id
    label1 = id[0]
    label2 = id[1]

【讨论】:

谢谢,但这样做不允许我在标签中显示它。 @Bnd10706 我不明白你的意思? 当我在 Label(label1, systemImage: "") .foregroundColor(.white) .frame(height: 48) 中尝试这个时 @Bnd10706 因为它返回Character,正如您的下标所述。要将其转换为 String,请执行 Label(String(label1), systemImage: "")... 'subscript(_:)' 不可用:不能用 Int 为 String 下标,请改用 String.Index。【参考方案3】:

这里有一个适合你的方法:

func characterOf(_ string: String, offset: Int) -> Character? 

    let array = Array(string)
    
    if Array(string).indices.contains(offset) 
        return array[offset]
    
    else 
        return nil
    


用例:

print(characterOf("Hello, world!", offset: 7) ?? "Error with offset!")  // Result: Optional("w")

【讨论】:

以上是关于如何在 SwiftUI 中获取字符串索引?的主要内容,如果未能解决你的问题,请参考以下文章

当列表填充数组时,如何在 SwiftUI 中获取列表中元素的索引?

SwiftUI 如何获取对 List 内编辑 Textfield 的参考?

在 SwiftUI 中的 forEach 中获取索引和值

如何通过索引获取字符串中的字符?

如何获取在字符串中多次出现的单词的多个索引? [复制]

SwiftUI - 在 ForEach 中获取 TextField 数组