作为一个程序员,所有例行性、重复性工作都应该尽可能考虑用脚本去完成。比如每日编译,应用打包,代码拉取等。

在我们的项目中已经用了很多Bash脚本,现在我们也可以使用Swift语言来完成类似的工作了。

Hello World

  • 我们先来创建一个简单的swift脚本,创建一个test.swift(本文所有例子使用Swift 3.0)文件: #!/usr/bin/swift print("hello world")`
  • 修改为可执行文件 chmod u+x test.swfit
  • 运行脚本: ./test.swift

实用技巧

使用FileManager来操作文件

#!/usr/bin/swift
import Foundation

let fileManager = FileManager.default
let path = fileManager.currentDirectoryPath

print("Current Path:" + path)

使用CommandLine来获取脚本参数

print(CommandLine.argc) // 2
print(CommandLine.arguments) // ["./test.swift", "hello"]

Swift运行bash命令

/***
 * 执行shell命令,返回执行结果和输出结果
 */
@discardableResult func shell(_ args: String...) -> (Int32, String) {
    let process = Process()
    process.launchPath = "/usr/bin/env"
    process.arguments = args
    
    let pipe = Pipe()
    process.standardOutput = pipe
    
    process.launch()
    process.waitUntilExit()
    
    
    let data = pipe.fileHandleForReading.readDataToEndOfFile()
    let output: String = String(data: data, encoding: .utf8)!
    
    return (process.terminationStatus, output)
}

//执行ls
var result = shell("ls").1
print("ls result:\n" + result)

指定颜色打印

enum ColorCode : String {
    case black = "\u{001B}[0;30m"
    case red = "\u{001B}[0;31m"
    case green = "\u{001B}[0;32m"
    case yellow = "\u{001B}[1;33m" //粗体
    case blue = "\u{001B}[5;34m" //粗体
    case magenta = "\u{001B}[0;35m"
    case cyan = "\u{001B}[0;36m"
    case white = "\u{001B}[0;37m"
    case `default` = "\u{001B}[0;39m"

}

func + (left: ColorCode, right: String) -> String {
    return left.rawValue + right
}

func + (left: String, right: ColorCode) -> String {
    return left + right.rawValue
}

result = shell("pwd").1
print("ls result" + ColorCode.blue + "\n" + result)

相关第三方库介绍

Rainbow

Rainbow可以打印非常丰富的样式

public enum Color: UInt8 {
    case black = 30
    case red
    case green
    case yellow
    case blue
    case magenta
    case cyan
    case white
    case `default` = 39
    case lightBlack = 90
    case lightRed
    case lightGreen
    case lightYellow
    case lightBlue
    case lightMagenta
    case lightCyan
    case lightWhite
    
    public var value: UInt8 {
        return rawValue
    }
}


public enum Style: UInt8 {
    case `default` = 0
    case bold = 1
    case dim = 2
    case italic = 3
    case underline = 4
    case blink = 5
    case swap = 7
    
    public var value: UInt8 {
        return rawValue
    }
}

SwiftShell

SwiftShell 支持很多高级功能,如读取输入、异步运行命令等

分工实现实用的Swift脚本

  • 找出项目中没有用到的图片
  • 分析3套皮肤中相同图片的个数、存储大小及其占所有图片的比例
  • 找出项目中未本地化的字符串
  • 检查项目中注册了通知,但没有取消注册的问题