首先我必須說清楚的是,本文的重點不是講如何通過Swift實現(xiàn)持續(xù)震動這個功能佛嬉,而是通過實現(xiàn)這個功能來學習在Swift中如何把一個c函數(shù)作為另一個函數(shù)的參數(shù)祸轮。之所以選這個功能,也是百度了一下芳室,發(fā)現(xiàn)并沒有用swift實行的博客(要么語法過時,要么編譯不過)刹勃。如果僅僅只是關注功能的實現(xiàn)堪侯,可以直接拉到底部。
如果你有OC使用經(jīng)驗荔仁,一定知道先要注冊一個震動的回調:
let temp :UnsafeMutablePointer =nil
AudioServicesAddSystemSoundCompletion(kSystemSoundID_Vibrate,nil,nil,soundCompleteCallback(kSystemSoundID_Vibrate, temp),nil)
然后實現(xiàn)soundCompleteCallback這個回調函數(shù):
上面這段代碼的意思就是2秒震動一次伍宦,結下來當你使用
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate)
我們預計的結果是回調到soundCompleteCallback函數(shù),然后2秒后再次震動乏梁,然后又回調次洼,2秒后再震動....這樣就實現(xiàn)了持續(xù)震動。
然而遇骑,事實是Xcode會報一個異常:
Cannot convert value of type '()' to expected argument type 'AudioServicesSystemSoundCompletionProc' (aka '@convention(c) (UInt32, UnsafeMutablePointer<()>) -> ()')
大意就是參數(shù)不對卖毁,我們再看看swift源碼
AudioServicesAddSystemSoundCompletion這個函數(shù)的第個4個參數(shù)是一個繼承AudioServicesSystemSoundCompletionProc的c函數(shù),看到這里我也是不得要領,歡迎大神在評論區(qū)指點落萎。不過當我用oc那樣只傳函數(shù)名的時候亥啦,Xcode給了我一點提示:
A C function pointer can only be formed from a reference to a'func' or a literal closure
回調函數(shù)只能是一個指針指向一個C函數(shù)
在Swift中你只能通過一個全局函數(shù)或閉包(不能值捕獲,如果你對swift中的閉包或者值捕獲不了解练链,請參考:swift閉包(中文翻譯)),不能使一個實例方法翔脱。于是我換成下面這種寫法:
用閉包完美解決了這個“2秒一次,持續(xù)震動”的問題媒鼓。但是届吁,對于全局函數(shù)這種方式我也嘗試了多次,發(fā)現(xiàn)始終解決不了绿鸣。
水平有限疚沐,說錯了的地方希望大神補充。