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()
}
}
我按照 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()
}
}