Epi*_*ime 27 view swift watchos swiftui
我正在努力在视图中输出随机字符串。
由于错误:
类型 '()' 不能符合 'View
我了解到 View 不是写下函数本身的合适位置。
我应该怎么做才能输出itemX.randomElement()和itemY.randomElement()?
struct SummaryView: View {
var avgValue = 1.5
var roundedKarvonenValue: Double
var itemX = ["A", "B", "C", "D", "E", "F", "G", "H"]
var itemY = ["I", "J", "K", "L", "M", "N", "O", "P"]
var body: some View {
ScrollView {
VStack(alignment: .leading) {
if workoutManager.averageHeartRate < roundedKarvonenValue {
print(itemX.randomElement()!)
} else {
print(itemY.randomElement()!)
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
Mum*_*ain 35
您可以在视图中使用 print 语句,如下所示:
VStack(alignment: .leading) {
if workoutManager.averageHeartRate < roundedKarvonenValue {
let _ = print(itemX.randomElement()!)
} else {
let _ = print(itemY.randomElement()!)
}
}
Run Code Online (Sandbox Code Playgroud)
Yrb*_*Yrb 13
这个问题有很多东西需要解开,但我们首先从简单的开始。Views用于在屏幕上显示某些内容。而已。您对这些语句有问题的原因print()是它们用于打印到控制台,而不是屏幕。因此,编译器会给你一个错误。要解决此问题,请使用Text@JoakimDanielson 所说的:
struct SummaryView: View {
var workoutManager: WorkoutManager //This var must be declared
var avgValue = 1.5
var roundedKarvonenValue: Double
var itemX = ["A", "B", "C", "D", "E", "F", "G", "H"]
var itemY = ["I", "J", "K", "L", "M", "N", "O", "P"]
var body: some View {
ScrollView {
VStack(alignment: .leading) {
if workoutManager.averageHeartRate < roundedKarvonenValue{
Text(itemX[0])
} else {
Text(itemY[0])
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
至于你的第二部分,即在哪里放置你的函数,并不是那么明确。您应该查找 MVVM 架构,以了解在 SwiftUI 中构建应用程序的标准方法。现在,您只是显示HealthKit使用 Apple WWDC 的数据class WorkoutManager(我猜)。
在最基本的层面上,如果您的函数与更改数据的显示方式有关,那么它会保留在View. 如果该函数从根本上改变了您的某些内容Model或多个视图需要该函数,则应将其放入Model. 这是一个判断。
因此,对于您的代码,您将显示视图中声明的变量中的随机元素。这些都是本地的东西,所以函数保留在视图中。添加func randomElement()并清理代码后,您将得到以下结果:
struct SummaryView: View {
// If you are not changing the variables, declare them as constants. This uses less memory.
let workoutManager: WorkoutManager
let avgValue = 1.5
let roundedKarvonenValue: Double
let itemX = ["A", "B", "C", "D", "E", "F", "G", "H"]
let itemY = ["I", "J", "K", "L", "M", "N", "O", "P"]
var body: some View {
ScrollView {
VStack(alignment: .leading) {
// I turned your if statement into a Terniary Conditional Operator to shrink the amount of code.
Text(workoutManager.averageHeartRate < roundedKarvonenValue ? randomElement(itemX) : randomElement(itemY))
}
}
}
func randomElement(_ stringArray: [String]) -> String {
let end = stringArray.count - 1
let index = Int.random(in: 0...end)
return stringArray[index]
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
38052 次 |
| 最近记录: |