如何在SwiftUI中将()打印到Xcode控制台?

如何在SwiftUI中将()打印到Xcode控制台?,swiftui,Swiftui,因此,我尝试在SwiftUI视图中调试时放置一个print语句 print("landmark: \(landmark)") 在下面的正文中 var body: some View { NavigationView { List { Toggle(isOn: $userData.showFavoritesOnly) { Text("Favorite only") }

因此,我尝试在SwiftUI视图中调试时放置一个print语句

print("landmark: \(landmark)")
在下面的正文中

var body: some View {
    NavigationView {
        List {
            Toggle(isOn: $userData.showFavoritesOnly) {
                Text("Favorite only")
            }
            ForEach(landmarkData) { landmark in
                print("landmark: \(landmark)")
                if !self.userData.showFavoritesOnly || landmark.isFavorite {
                    NavigationButton(destination: LandmarkDetail(landmark: landmark)) {
                        LandmarkRow(landmark: landmark)
                    }
                }
            }
        }
       .navigationBarTitle(Text("Landmarks"))            
    }
}
编译器错误:

那么,在SwiftUI中打印到控制台的正确方式是什么

编辑: 我让Landmark符合客户要求:


我仍然得到“字符串不能转换为任何”错误。它现在应该工作吗?

您不能,因为您在计算属性中。例如,您需要一个按钮,并在操作中定义打印。或者使用断点

您不能打印主体结构,即某个视图类型的结构。要打印,您需要使用主体结构生成功能,并使用按钮或其他方式调用它。

尝试右键单击实时预览播放按钮,然后从弹出窗口中选择“调试预览”,这是可能的要使用print(),请记住所有SwiftUI视图内容都是(a)隐式闭包和(b)强烈建议尽可能多地分解视图以获得简单的结构,因此它可能如下所示

结构模型:可识别{ let值:字符串 变量id:String{ 价值 } init(u值:字符串){ 自我价值=价值 } } 结构测试视图:视图{ @状态变量showFavoritesOnly=false @状态变量列表数据:[模型]=[模型(“一”)、模型(“二”)、模型(“三”)] var body:一些观点{ 导航视图{ 名单{ 切换(isOn:$showFavoritesOnly){ 文本(“仅限收藏夹”) } ForEach(listData){中的数据 self.rowView(数据:数据) } } } } 私有函数行视图(数据:模型)->某些视图{ #如果调试 打印(“>>\(data.value)”) #恩迪夫 返回导航链接(目的地:文本(“详细信息”)){ 文本(“从\(data.value)转到下一步”) } } } 。。。并在预览中单击鼠标右键,选择“作为调试预览运行”,我们将获得:

2019-10-31 14:28:03.467635+0200 Test[65344:11155167] [Agent] Received connection, creating agent
2019-10-31 14:28:04.472314+0200 Test[65344:11155168] [Agent] Received display message
>> one
>> two
>> three

这里有一个helper
Print(…)
视图,其作用类似于
Print(…)
函数,但在视图中

将其放在任何视图文件中

extension View {
    func Print(_ vars: Any...) -> some View {
        for v in vars { print(v) }
        return EmptyView()
    }
}
并且像这样使用
主体内部

Print("Here I am", varOne, varTwo ...)
self.Print("Inside ForEach", varOne, varTwo ...)
或者像这样在一个
ForEach{}

Print("Here I am", varOne, varTwo ...)
self.Print("Inside ForEach", varOne, varTwo ...)

注意:当与现有视图组合时,可能需要将
Print()
放入
组{}
,您可以在主体结构中打印,但要这样做,您必须明确返回要渲染的视图。通常在SwiftUI中,body属性隐式返回视图。例如,当您尝试打印时,这将引发错误:

struct SomeView: View {
  @State var isOpen = false

  var body: some View {
    print(isOpen) // error thrown here

    VStack {
      // other view code
    |
  }
}
但是如果我们显式地返回我们想要的视图,那么它就会工作

struct SomeView: View {
  @State var isOpen = false

  var body: some View {
    print(isOpen) // this ok because we explicitly returned the view below

     // Notice the added 'return' below
     return VStack {
      // other view code
    }
  }
}

如果您希望在返回视图之前查看状态或环境对象是如何变化的,那么上述方法将很有效,但是如果您希望在试图返回的视图中打印更深的内容,那么我将使用@Rok Krulec answer。

至少在Xcode 12/Swift 5.3中,只需将print语句的返回值存储在通配符中,即可轻松地将其添加到函数生成器中的任意位置,有效地忽略它:

let _ = print("hi!")

无需设置或其他详细信息

调试预览的非常简单的方法:

  • 在Xcode 11中打开Swift项目
  • 在预览右下角的实时预览按钮上单击鼠标右键(或控制单击)
  • 选择调试预览

  • 它可以概括为:

    扩展视图{
    func-Perform(uu-block:()->Void)->一些视图{
    块()
    返回空视图()
    }
    }
    
    在你的例子中:

    ForEach(landmarkData){landmark in
    执行{打印(“landmark:\(landmark)”)}
    if!self.userData.showFavoritesOnly | | landmark.isFavorite{
    导航按钮(目的地:LandmarkDetail(landmark:landmark)){
    LandmarkRow(landmark:landmark)
    }
    }
    }
    
    给你。它只会像简单的打印一样工作,但在视图中

          func printv( _ data : Any)-> EmptyView{
           print(data)
           return EmptyView()
          }
    
    像那样使用它

    struct ContentView: View {
    var body: some View  {
        VStack() {
            
            Text("hello To SwiftUI")
            
            printv("its easy to code in SwiftUI")
            
            Text("And Good to have you here")
        }
      } 
    }
    

    //尝试此操作,在视图上添加一个“返回”,这样“打印”就可以在视图中保持活动状态

    struct ContentView: View {
        var num: Int = 1
        
        var body: some View {
            print(num)
            
            return  Text("hello")
        
        }
    }
    

    您的landmark是否符合
    CustomStringConvertible
    ?您的问题是关于打印,但由于出现错误,无法编译。首先修复错误,我确信打印会很好。我编辑了问题。出于某种原因,我不得不重新清理和构建,然后另一个错误消失了。您是否尝试在Xcode 12.4上的NavigationButton之前添加
    return
    ?只有在我使用真实设备时,所有打印结果才会出现在调试区域。关于macOS中SwiftUI的调试预览,似乎最新的Xcode(11.3)尚未支持使用
    print()
    将日志打印到Xcode的控制台。AFAIK目前只有带有日志消息操作的断点才能执行此操作。或者,作为另一种解决方法,您可以将调试预览与Console.app一起使用,以便在应用中查看调试日志。请注意,您需要使用
    NSLog(){let string=items.map{string(description:$0)}.joined(separator:separator)print(“print:”,string,terminator:terminator)//可以在此处添加其他内容返回EmptyView()}self.print(“view named”,self.someName,“number:”,self.num)版本和NSLog,适用于需要时间戳的任何人:
    扩展视图{func NSLogView(uformat:String,args:CVarArg…)->some View{NSLog(format,args)return EmptyView()}
    这应该是可以接受的答案