在閱讀SwiftMonkey源碼的過程中,由于對swift語言還不是很了解爆办,所以先補了一下swift的基本語法。理解swift以下幾個語法點后,就很容易讀懂SwiftMonkey的源碼了锨推。
1.swift的函數(shù)定義格式為func 函數(shù)名(參數(shù)名:類型) -> 函數(shù)返回類型
如下面這段代碼,addAction方法有兩個參數(shù)weight和action公壤,weight是double類型换可;action是一個閉包參數(shù),接受一個無入?yún)⑾梅瑹o返回值的閉包沾鳄。其中@escaping標識符標識該閉包是允許“逃逸”出這個函數(shù)的,也就是允許這個閉包在函數(shù)返回之后才被執(zhí)行确憨。
public func addAction(weight: Double, action: @escaping (Void) -> Void) {
totalWeight += weight
randomActions.append((accumulatedWeight: totalWeight, action: action))
}
2.閉包的使用
如下面這段代碼译荞,這段代碼調(diào)用了上面的addAction方式。調(diào)用時在addAction后面緊跟著的{}中定義閉包休弃。其中[weak self]表示弱引用磁椒。
public func addXCTestTapAction(weight: Double, multipleTapProbability: Double = 0.05,
multipleTouchProbability: Double = 0.05) {
addAction(weight: weight) { [weak self] in //弱引用而已
let numberOfTaps: UInt
if self!.r.randomDouble() < multipleTapProbability {
numberOfTaps = UInt(self!.r.randomUInt32() % 2) + 2
} else {
numberOfTaps = 1
}
let locations: [CGPoint]
if self!.r.randomDouble() < multipleTouchProbability {
let numberOfTouches = Int(self!.r.randomUInt32() % 3) + 2
let rect = self!.randomRect()
locations = (1...numberOfTouches).map { _ in
self!.randomPoint(inRect: rect)
}
} else {
locations = [ self!.randomPoint() ]
}
let semaphore = DispatchSemaphore(value: 0)
self!.sharedXCEventGenerator.tapAtTouchLocations(locations, numberOfTaps: numberOfTaps, orientation: orientationValue) {
semaphore.signal()
}
semaphore.wait()
}
}
swift語法還有很多精髓,像弱引用等具體概念可以查看The Swift Programming Language中文版玫芦。但清楚上面兩點后浆熔,理解SwiftMonkey的源碼就沒問題了。
SwiftMonkey的源碼層次如下圖所示桥帆,首先實例化Monkey医增,然后調(diào)用addDefaultXCTestPrivateActions來插入一些隨機事件,然后調(diào)用addXCTestTAPalertAction方法用來對彈窗進行處理老虫,最后則調(diào)用monkeyAround方法執(zhí)行隨機事件叶骨。在SwiftMonkey源碼中,還有一個MonkeyUIAutomation.swift文件祈匙,這個文件是通過UIAutomation的私有api生成隨機事件忽刽,但目前處于被棄用狀態(tài)。(看作者說是這套方法不能正常使用)還有一個Random.swift文件夺欲,這里面定義了一些隨機生成器的方法跪帝。
最后補充說一點,私有api的查看可以借助class-dump工具些阅。我通過class-dump工具找到了再SwiftMonkey中使用的幾個私有api.
class-dump /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Frameworks/XCTest.framework
上述命令的返回結(jié)果中有下面這一段伞剑,紅框中的幾個私有api正是在SwiftMonkey中使用的。
上述文章中若有理解有誤的地方市埋,歡迎指正黎泣,謝謝恕刘。