SwiftUI 误导性错误:“Int”不可转换为“CGFloat”

Posted

技术标签:

【中文标题】SwiftUI 误导性错误:“Int”不可转换为“CGFloat”【英文标题】:SwiftUI misleading error: 'Int' is not convertible to 'CGFloat' 【发布时间】:2019-11-22 22:28:23 【问题描述】:

在第 83 行 .offset(x: 150, y:7) 上,我不断收到“Int”不可转换为“CGFloat”。如果我将数字包装在 CGFloat() 中,则相同的错误只会出现在其他地方。我知道这与我程序中的控制流有关,但我无法确定在哪里。请帮忙。

这是我的 DateTracking.swift 屏幕代码(出现错误)。

struct DateTracking: View 

    @State var recipes: [Recipe] = getRecipes()
    @State var filterRecipesBy: String = ""
    @State private var searchTerm: String = ""
    @State var sortedNames: [Item] =  getItemsSortedByNames()
    @State var sortedDays: [Item] =  getItemsSortedByDaysLeft()
    @State var arraySelection: Int = 0
    @State var sortBySelected: Bool = false
    @State var recipesShown: Bool = false
    @State var buttonShown: Bool = true


    var body: some View 

        NavigationView

            ZStack


                VStack

                    SearchBar(text: $searchTerm)



                    if(self.arraySelection == 0)
                        QGrid(sortedDays.filter 
                                    self.searchTerm.isEmpty ? true :
                                        $0.imageName.localizedCaseInsensitiveContains(self.searchTerm)
                                , columns: 3)  item in


                                    Button(action: 
                                        self.filterRecipesBy = item.imageName
                                        recipesShown.toggle()
                                    )
                                        ListItem(imageName: item.imageName, daysLeft: item.daysLeft, redBackground: item.redBackground )
                                    



                                
                                //.background(Color(red: 239 / 255, green: 239 / 255, blue: 239 / 255))
                            

                    if(self.arraySelection == 1)
                        QGrid(sortedNames.filter 
                                    self.searchTerm.isEmpty ? true :
                                        $0.imageName.localizedCaseInsensitiveContains(self.searchTerm)
                                , columns: 3)  item in

                                    ListItem(imageName: item.imageName, daysLeft: item.daysLeft, redBackground: item.redBackground )

                                
                            //.background(Color(red: 239 / 255, green: 239 / 255, blue: 239 / 255))
                        

                    



                if (self.sortBySelected == true)
                    VStack

                        Button(action: 
                            self.sortBySelected.toggle()
                        ) 
                            Text("Done")

                        
                        .offset(x: 150, y: 7)

                        Picker(selection: self.$arraySelection, label:
                            Text("Picker Name"))
                            Text("Expiry Date").tag(0)
                            Text("Names").tag(1)

                        
                        .labelsHidden()


                    
                    .frame(width:375)
                    .background(Color(red: 239 / 255, green: 239 / 255, blue: 239 / 255))
                    .offset(x: 0, y: 140)


                

                if (self.recipesShown == true)
                    VStack(alignment: .center, spacing: 15) 

                        HStack 
                            Button(action: self.recipesShown.toggle()
                            )
                                Cross()
                            
                            .offset(x: -70, y: 11)
                            Text(verbatim: "Recipes You Can Cook")
                                .font(.headline)
                                .fontWeight(.bold)
                                .padding(.top)
                                .offset(x: -50, y: 5)
                        


                        RecipesVertical(recipes: self.recipes.filter($0.ingredients.contains(filterRecipesBy)))
                            .padding(.leading)

                            //.offset(x: 0, y: 140)
                    
                    .frame(width:375, height:310, alignment: .center)
                    .background(Color.white)

                

               /* if(buttonShown == true)
                    Button(action: self.recipesShown = true
                        self.buttonShown = false
                    )
                        Image("floatingrecipebutton")
                        .resizable()
                            .frame(width: 85, height: 85)
                            .shadow(radius: 10)

                                   
                                       .offset(x: 125, y:200)
                
               */





            
                .navigationBarTitle(Text("Date Tracking"))
                .navigationBarItems(trailing:

                HStack

                    Button(action: 
                        self.sortBySelected.toggle()
                        )
                        Text("Sort by")
                    

                        


            )


        

    



【问题讨论】:

这是一个“为什么这段代码不起作用”的问题。它需要一个 MCVE。 (***.com/help/minimal-reproducible-example) 这里有很多代码,它不会为响应者编译,因为它包含很多我们没有的类型和函数。将其减少到产生问题的最小代码(我怀疑当你这样做时,你也会找到答案)。 【参考方案1】:

在 Swift 中,您不能在没有明确转换的情况下将 Int 分配给 CGFloat。

在这种情况下,您可以改为1.0,而不是写1。这样就行了。

【讨论】:

***.com/questions/25795316/…【参考方案2】:

我相信你得到的错误代码在这里是模糊的,如果你尝试解决 GCFloat 那么 Xcode 会带来一些其他类似的问题。

问题可能出在你的语法上(曾经是我的问题),这是我分享的另一个 youtube 视频链接,其中实际问题不同,Xcode 显示类似的错误。

https://www.youtube.com/watch?v=aLSzgZtOpG8&list=PLMRqhzcHGw1Z-lZaaun3A3mV9PbEfHANI&index=8

在 22:30 左右播放视频,会出现类似的 GCFloat 错误,而实际问题出在 VStack。

【讨论】:

以上是关于SwiftUI 误导性错误:“Int”不可转换为“CGFloat”的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 错误修复“无法将 'Binding<int>' 类型的值转换为预期类型 'Binding<_>?'”

SwiftUI 核心数据错误 - “无法将 'FetchedResults<GCItem>' 类型的值转换为预期的参数类型 'Range<Int>'”

使用 pyspark 的 toPandas() 错误:'int' 对象不可迭代

SwiftUI 文本视图不显示不可显示的字符

SwiftUI 将 Int 值传递给 ViewModel

将 SwiftUI 中的文本与背景属性相结合会产生错误,因为无法将“某些视图”类型的值转换为预期的参数类型“文本”?