在 SwiftUI 中返回一个或两个不同文本视图的速记参数名称 $0 上添加条件

Posted

技术标签:

【中文标题】在 SwiftUI 中返回一个或两个不同文本视图的速记参数名称 $0 上添加条件【英文标题】:Add conditions on shorthand argument name $0 that returns one or two different text views in SwiftUI 【发布时间】:2019-12-23 22:31:28 【问题描述】:

我有以下问题,并想添加一些引用func 的条件,例如if conditionName() == $0 是真的这样做...否则...在Button($0) 内使用速记参数名称$0。有任何想法吗?提前谢谢你。

struct ContentView: View 

    let emojiMoves = ["????", "????", "✂️"]
    let textMoves = ["rock", "paper", "scissors"]

    @State private var appChoice = Int.random(in: 0...2)
    @State private var userChoice = Bool.random()

    var body: some View 
        HStack(alignment: .center, spacing: 30) 
            ForEach(self.emojiMoves, id: \.self ) 
                Button($0) 
            
        
    

【问题讨论】:

您的意思是在Button($0) 内还是代替? 在 Button($0) 内,谢谢! 你不能在另一个闭包中使用一个闭包的速记参数,因为速记只指自己的闭包,所以接下来要传递参数你必须使用明确命名的参数,如下所示。 @Asperi 是正确的,我的意图是在 Button($0) 中添加这样的条件,我想我有一个可行的解决方案。感谢您的反馈! 【参考方案1】:

你基本上不能,也没有必要,你可以尝试使用变量:

  ForEach(self.emojiMoves, id: \.self )  oneString in
            Button(Text(oneString)) 
              if conditionName() == oneString 
               
        

【讨论】:

谢谢@E.Coms,这是一个不错的解决方案,但我正在寻找其他解决方案。我想我有下面的解决方案【参考方案2】:

在三元条件运算符的帮助下,我找到了这个解决方案,它在 Button 中加载带有简写参数名称 $0 的按钮。

ForEach(self.emojiMoves, id: \.self ) 
      Button($0 == "?" ? "?" : $0 == "?" ? "?" : "✂️") 
     

谢谢

【讨论】:

以上是关于在 SwiftUI 中返回一个或两个不同文本视图的速记参数名称 $0 上添加条件的主要内容,如果未能解决你的问题,请参考以下文章

从 SwiftUI 函数返回填充的 VStack

SwiftUI:在同一个文本视图中使用不同的颜色

如何在适合视图的同时使文本大小一致

SwiftUI - 如何从不同的视图中获取 GeometryReader 的大小/高度?

如何在swiftui中的视图之间传递变量?

SwiftUI使用MatchedGeometryEffect快速同步不同继承层级中视图的位置和尺寸