Swift in Xcode
Swift基础,Xcode配置Xcode中Other Swift Flags
在程序中添加Debug的识别标示位。通过#宏语法进行编译时的代码筛选。配置方式
defer
在块的结束位置触发,比如查看当前函数的执行时间。let _classNameForLog: String = "\(type(of: self))"
let _timeInterval = Date().timeIntervalSince1970
print(" -> \(_classNameForLog) \(#function)")
defer{
let _diffTimeInterval = Date().timeIntervalSince1970 - _timeInterval
print(" <- \(_classNameForLog) -> \(#function) : \(_diffTimeInterval)")
}
LOG输出
在程序中添加Debug的识别标示位。通过类似#宏语法进行编译时的代码筛选。func LogPlus<T> (message_: T, fileName_: String = #file, funcName_: String = #function, lineNum_: Int = #line) {
#if DEBUG
let _file = (fileName_ as NSString).lastPathComponent
print("-\(_file) \(funcName_)-[\(lineNum_)]: \(message_)")
#endif
}
苹果官方提供的底耗Log工具,来结合instrument.app来查看调用时机和层级,有点儿像火焰图,只显示手工指定的方法。
//苹果官方提供的Log分析工具,结合 instruments.app 可以查看调用层级,时间点等等信息。
//LogUtils.swift
import os.signpost
struct LogUtils{
static let funcTrackerLog = OSLog(subsystem: gl.bundleID, category: "funcTracker")
}
//任意swift类的方法起始处
let _uniqueID = "[\(#file)]\(type(of: self))->\(#function)"
os_signpost(.begin, log: LogUtils.funcTrackerLog, name: _uniqueID)
defer {
os_signpost(.end, log: LogUtils.funcTrackerLog, name: _uniqueID)
}
if let 和 if guard
防御式编程,怎么使用guard。没有的时候做什么处理,常用来判断空或者转型失败。 //通过名称获取DisplayObject,在其身上直接获取SKSpriteNode实例对象
func getSpriteNodeByName(_ name_: String) -> SKSpriteNode? {
guard let _child = self.getChildByName(name_) else {//如果没有返回空
logUtils.LogPlus(#"getChildByName : "#+"\(name_)"+" is nil")
return nil
}
guard let _skSpriteNode = _child.skNode as? SKSpriteNode else {//如果不是返回空
logUtils.LogPlus("\(name_)"+#".skNode is nil"#)
return nil
}
return _skSpriteNode
}