本帖最后由 Caesar 于 2016-10-14 10:59 编辑


继上一篇《如何构造Swift框架(1)知识储备》,我们开始编写功能代码。




1、环境管理 ModeSwitch

新建ModeSwitch.swift

[Swift] 纯文本查看 复制代码
import Foundation
/// 开发模式
public enum Mode: String {
  /// 开发模式,打印日志,不上报日志
  case develope = "[DEVELOPE MODE]"
  /// 调试模式,关闭日志打印,上报日志
  case prepared = "[PREPARED MODE]"
  /// 生产模式,关闭日志打印,上报日志
  case production = "[PRODUCTION MODE]"
}
/// 模式控制
public class INSModeSwitch {
  /// 默认为调试模式
  public static let `default` = INSModeSwitch(.develope)
  
  public var currentMode: Mode {
    didSet {
    }
  }
  /// 私有初始化方法
  private init(_ mode: Mode) {
    self.currentMode = mode
  }
}
/// 模式选择器
public let ModeSwitcher = INSModeSwitch.default


目前这是一个极其简单的模式控制,毫无别的作用,以后扩展功能。




2、日志模块-基础日志 Console

第一步我们先完成日志输出,新建Logger.swift

[Swift] 纯文本查看 复制代码
import Foundation
/// 日志级别
public enum LogLevel: String {
  /// 打印所有类型日志
  case all = "[ALL]"
  /// 仅打印调试日志
  case debug = "[DEBUG]"
  /// 仅打印警告日志
  case warning = "[WARN]"
  /// 仅打印信息日志
  case information = "[INFO]"
}
final public class INSLogger {
  /// 默认为输出全部日志
  public static let `default` = INSLogger(.all)
  
  public var level: LogLevel {
    didSet {
      
    }
  }
  
  /// 日志输出
  ///
  /// - parameter lev: 日志级别
  /// - parameter content: 日志内容
  public func printLog(_ lev: LogLevel, _ details: String, _ items: Any) {
    guard level == .all || level == lev, ModeSwitcher.currentMode == .develope else {
      return
    }
    
    print(lev.rawValue, details, "\n", items)
  }
  
  private init(_ level: LogLevel) {
    self.level = level
  }
}
/// 公开日志打印模块
public let Logger = INSLogger.default
/// 公开便捷调用方法
public func ILog(_ lev: LogLevel, _ items: Any, _ function: StaticString = #function, _ line: Int = #line, _ file: StaticString = #file) {
  var details = "[\("\(file)".components(separatedBy: "/").last!): \(function): \(line)]"
  Logger.printLog(lev, details, items)
}


这个时候,我们对前2部分进行简单的测试:

[Swift] 纯文本查看 复制代码
ModeSwitcher.currentMode = .develope
print(ModeSwitcher.currentMode)
    
Logger.level = .warning
    
ILog(.all, "Hello world! Current Mode is \(Logger.level)")
ILog(.debug, "Hello world! Current Mode is \(Logger.level)")
ILog(.warning, "Hello world! Current Mode is \(Logger.level)")
ILog(.information, "Hello world! Current Mode is \(Logger.level)")


.developer情况下会输出相应的日志,.all为输出所有日志,预发、生产模式下不会输出日志。

[Swift] 纯文本查看 复制代码
 [WARN] [ViewController.swift: viewDidLoad(): 24] 
 ["2": "3", "4": "5"]


分别为文件,方法,行号,内容。




3、功能扩展,界面扩展

一些Foundation,UIKit的扩展。新建2个文件夹,分别为FoundationExtension,UIKitExtension。在文件夹内添加这些扩展方法。这一块内容暂时省略,接着往下写功能模块。

UISDK这里我依旧支持AsyncDisplayKit,从这个库诞生我就开始一直使用,所以对于我来说,用这个比UIKit顺手:

[Bash shell] 纯文本查看 复制代码
pod "AsyncDisplayKit"


Foundation扩展先添加Keychain的帮助模块