SwiftUI 随机元素

SwiftUI Random Element

我按照 https://developer.apple.com/documentation/swift/array/2994747-randomelement 上的说明进行操作 给出这个例子

let names = ["Zoey", "Chloe", "Amani", "Amaia"]
let randomName = names.randomElement()!
// randomName == "Amani"

这行不通,因为 randomName 没有初始化,所以我尝试了一个解决方法:

   let words = [
    "anbieten","anbietend","angeboten"]

 var  random : String { words.randomElement()!}

为了提供一些上下文,我将这个随机变量用于一个应该显示同一个词 3 次的游戏,所以我需要能够确保“random”的值包含 yes 数组中的一个随机词但总是相同的随机数。

不幸的是,当我在 SwiftUI 中使用变量时

  NavigationLink(destination: ResultView(choice: "Arial")) {
                    Text("\(random)").font(.custom("Arial", size: 60))
                }
                
                NavigationLink(destination: ResultView(choice: "San Francisco")) {
                    Text("\(random)").font(.system(size: 60))
                }

它显​​然显示了数组的两个不同元素。

我确实尝试按照苹果开发者网站中的示例将我的随机数更改为 let

let  random : String { words.randomElement()!}

但是这个returns

 let' declarations cannot be computed properties

你不能让它成为一个计算 属性 因为,正如你所看到的,它是不一致的。你想要的是一个常量(即 let),但如你所见,你不能计算出一个常量 属性(如果你仔细想想,它对某些东西来说真的没有意义“每次都相同”[常量] 和“每次都重新计算”[计算 属性])。相反,您想基本上做您在第一个代码清单中所做的事情:

let names = ["Zoey", "Chloe", "Amani", "Amaia"]
let randomName = names.randomElement()!

你说这不起作用,因为 randomName 没有初始化。我假设您是在这种情况下尝试的:

struct MyView: View {
    let names = ["Zoey", "Chloe", "Amani", "Amaia"]
    let randomName = names.randomElement()!

    var body: some View {
        MyOtherView()
    }
}

它没有用。要解决该问题,只需像这样定义一个初始化程序:(您也可以向初始化程序添加您需要的任何其他参数)

struct MyView: View {
    let names = ["Zoey", "Chloe", "Amani", "Amaia"]
    let randomName: String

    init() {
        self.randomName = names.randomElement()!
    }

    var body: some View {
        MyOtherView()
    }
}

注意:如果您有任何 @Binding 变量传递给此视图,您可能对如何将它们包含在初始化程序中感到有点困惑,所以这里有一个简短的例子:

struct SuperView: View {
    @State var text: String = ""

    var body: some View {
        SubView(text: self.$text)
    }
}

struct SubView: View {
    @Binding var text: String
    let names = ["Zoey", "Chloe", "Amani", "Amaia"]
    let randomName: String

    init(text: Binding<String>) {
        self._text = text // this accesses the raw Binding<String> variable, allowing you to use the passed value
        self.randomName = names.randomElement()!
    }

    var body: some View {
        SomeOtherView()
    }
}