print输出 swift

2016-04-22 15:03:33 wj610671226 阅读数 4965

Swift中Debug和Release两种状态下print()函数调试切换

       在编写项目的过程中,我们常常会打印信息到控制台,通过打印的信息来判断代码的流程或者正确性。但是这些信息仅仅在Debug的状态下需要,一旦版本发布之后,我们就不需要这些打印操作了。如果是在发布版本之前,程序员手动一个个的去注释或者删除打印操作,这必然是一件浪费时间而又麻烦的事情。如果不处理,上线的版本运行在手机中,这些打印操作势必会影响一些性能的。下面就记录一下在项目中如何处理。

一、在OC代码中,我们常常会通过一个宏定义来控制打印操作

#ifdef DEBUG
#define MyLog(...) NSLog(__VA_ARGS__)
#else
#define MyLog(...)
#endif

二、在Swift中我一般使用下面两种方法来控制

1、自己写一个工具类 DebugLogTool, 通过控制isDebug 的值来控制打印情况,有点点不智能哈

2、通过配置工程文件,加上工具类 DebugLogTool

2018-05-04 10:10:36 fzhlee 阅读数 3668
1. 日志输出功能经常被用于代码的调试,本节课将为您演示几个常见的日志输出语句。 


2. 首先声明一个字符串类型的常量。 


3. print是最常用的日志输出语句,可以直观的看到变量或常量的值。它不会显示无关紧要,以及没有必要来表示打印的变量的信息。 


4. 从底部的控制台也可以看到输出的日志信息。 


5. debugPrint可以将推断出的类型添加到输出,例如给字符串内容添加双引号。 


6. dump通常用于将一个对象的内容,如数组、字典等,转移到标准输出。 


7. 使用加号,可以将多项内容进行拼接输出。 


8. 声明一个字符串常量。 


9. 使用加号可以将两个常量进行拼接输出。 


10. 除了使用加号,也可以采用斜线与小括号\()的方式,将需要输出的常量或变量,放置在小括号之内,即可将常量或变量输出到字符串中的指定位置。 



本文整理自:《Swift4互动教程》,真正的[手把手]教学模式,用最快的速度上手iOS开发和Swift语言,苹果商店App Store免费下载:https://itunes.apple.com/cn/app/id1320746678,或扫描本页底部的二维码。课程配套素材下载地址:资料下载

2015-12-30 23:08:54 magic_castle 阅读数 5443

Log 输出是程序开发中很重要的组成部分,虽然它并不是直接的业务代码,但是却可以忠实地反映我们的程序是如何工作的,以及记录程序运行的过程中发生了什么。

在 Swift 中,最简单的输出方法就是使用 print,在我们关心的地方输出字符串和值。但是这并不够,试想一下当程序变得非常复杂的时候,我们可能会输出很多内容,而想在其中寻找到我们希望的输出其实并不容易。我们往往需要更好更精确的输出,这包括输出这个 log 的文件,调用的行号以及所处的方法名字等等。

我们当然可以在 print 的时候将当前的文件名字和那些必要的信息作为参数同我们的消息一起进行打印:

// Test.swift
func method() {  
    //...
    print("文件名:Test.swift, 方法名:method,这是一条输出")
    //...
}

但是这显然非常麻烦,每次输入文件名和方法名不说,随着代码的改变,这些 Log 的位置也可能发生改变,这时我们可能还需要不断地去维护这些输出,代价实在太大。

在 Swift 中,编译器为我们准备了几个很有用的编译符号,用来处理类似这样的需求,它们分别是:

符号 类型 描述
FILE String 包含这个符号的文件的路径
LINE Int 符号出现处的行号
COLUMN Int 符号出现处的列
FUNCTION String 包含这个符号的方法名字

因此,我们可以通过使用这些符号来写一个好一些的 Log 输出方法:

func printLog<T>(message: T,  
                    file: String = __FILE__,
                  method: String = __FUNCTION__,
                    line: Int = __LINE__)
{
    print("\((file as NSString).lastPathComponent)[\(line)], \(method): \(message)")
}

这样,在进行 log 的时候我们只需要使用这个方法就能完成文件名,行号以及方法名的输出了。最棒的是,我们不再需要对这样的输出进行维护,无论在哪里它都能正确地输出各个参数:

// Test.swift
func method() {  
    //...
    printLog("这是一条输出")
    //...
}

// 输出:
// Test.swift[62], method(): 这是一条输出

另外,对于 log 输出更多地其实是用在程序开发和调试的过程中的,过多的输出有可能对运行的性能造成影响。在 Release 版本中关闭掉向控制台的输出也是软件开发中一种常见的做法。如果我们在开发中就注意使用了统一的 log 输出的话,这就变得非常简单了。使用条件编译的方法,我们可以添加条件,并设置合适的编译配置,使 printLog 的内容在 Release 时被去掉,从而成为一个空方法:

func printLog<T>(message: T,  
                    file: String = __FILE__,
                  method: String = __FUNCTION__,
                    line: Int = __LINE__)
{
    #if DEBUG
    print("\((file as NSString).lastPathComponent)[\(line)], \(method): \(message)")
    #endif
}

新版本的 LLVM 编译器在遇到这个空方法时,甚至会直接将这个方法整个去掉,完全不去调用它,从而实现零成本。

2020-01-16 21:16:11 bobbob32 阅读数 118

直接贴代码了,可以支持多参数,在别人基础上进行修改

public func Fprint(_ items: Any...,
                    separator: String = " ",
                   terminator: String = "\n",
                   _ file:String = #file,
                   _ function:String = #function,
                   _ line:Int = #line){
  
    
    var longStr:String = ""
    for value in items{
        var stringRepresentation:String = ""
        if let value = value as? CustomStringConvertible{
            stringRepresentation = value.description
        }else if let value = value as? CustomDebugStringConvertible{
            stringRepresentation = value.debugDescription
        }else if let value = value as? LosslessStringConvertible{
            stringRepresentation = value.description
        } else{
            //            fatalError("glog only work for values that conform to CustomStringConvertible or CustomDebugStringConvertible")
            //            print(objct)
        }
        longStr = longStr + "," + stringRepresentation
    }
    
    let gFormatter = DateFormatter()
    gFormatter.dateFormat = "HH:mm:ss:SSS"
    let timeStamp = gFormatter.string(from: Date())
    let queue = Thread.isMainThread ? "UI":"BG"
    let fileUrl = NSURL(string: file)?.lastPathComponent ?? "Unknown file"
    
    if longStr.count > items.count{
        print("FM \(timeStamp) {\(queue)} \(fileUrl) > \(function)[\(line)]: \(longStr)")
    }else{
        print("FM \(timeStamp) {\(queue)} \(fileUrl) > \(function)[\(line)]: \(items)")
    }
}

参考文章

2016-09-18 13:42:06 potato512 阅读数 5244

变量输出

变量和常量可以使用 printswift 2 print 替换了 println 函数来输出。

在字符串中可以使用括号" () "与反斜线" \ "来插入变量,即" \(变量名称) "

        

变量输出有两种格式

1、直接使用变量名称

2、在字符串中结合" \(变量名称) ",以参数的形式


// 直接使用变量名称输出
let lastName = "Zhang"
print(lastName)
        
let firstName = "Dev"
print(firstName)
// 在字符串中以参数形式输出
print("你的名称是:\(firstName)\(lastName)")
        
let age:Int = 3
print("我的年龄是 \(age) 岁")



Swift—文本输出流

阅读数 221

print输出

阅读数 269