我正在閱讀Chris Adamson的「Learning Core Audio」,並嘗試沿着Swift 3(而不是Objective-C)。Swift 3 - 使用UnsafePointer <CFDictionary>?
第一個代碼示例使用AudioTool
來收集有關音頻文件的信息。我的斯威夫特3版本是這樣的:
import Foundation
import AudioToolbox
func main() {
let arguments = CommandLine.arguments
guard arguments.count > 1 else {
print("Usage: CAMetaData /full/path/to/audiofile")
return
}
// Get filepath out of cmd-arguments
let audiofilePath = NSString(string: arguments[1]).expandingTildeInPath
// Load audio file into appropriate data structure
let audioURL = NSURL(fileURLWithPath: audiofilePath)
var audiofile: AudioFileID? = nil
var possibleError = noErr
possibleError = AudioFileOpenURL(audioURL, AudioFilePermissions.readPermission, 0, &audiofile)
assert(possibleError == noErr)
// Get size of metadata dictionary
var outDataSize: UInt32 = 0
possibleError = AudioFileGetPropertyInfo(audiofile!, kAudioFilePropertyInfoDictionary, &outDataSize, nil)
assert(possibleError == noErr)
// Get metadata
var outDataPointer: UnsafePointer<CFDictionary>? = nil
possibleError = AudioFileGetProperty(audiofile!, kAudioFilePropertyInfoDictionary, &outDataSize, &outDataPointer)
assert(possibleError == noErr)
// How to use this outDataPointer?
let outData = outDataPointer!.pointee as NSDictionary
dump(outData)
// No CFRelease necessary - Swift takes care of that
// Close connection to audiofile
possibleError = AudioFileClose(audiofile!)
assert(possibleError == noErr)
}
main()
一切似乎工作大(所有斷言/ AudioToolbox
-API呼叫傳遞)。現在我正在問自己如何能夠顯示存儲在outDataPointer
內的數據。
這就是我對這種情況的理解:outDataPointer
包含關聯類型UnsafePointer<CFDictionary>
的可選項。我可以驗證outDataPointer
不是nil
,因此訪問關聯的值不會使我的程序崩潰。 outDataPointer!.pointee
應該給我由outDataPointer
後面的相關值指向。 CFDictionary
澆注到NSDictionary
。
可悲傾倒墊層數據打印
- __NSAtom#0
到控制檯。不是我所期望的(有關audiofile的信息)。如何從我的outDataPointer
變量中獲取這些數據?
謝謝你的詳細解答!這絕對清除了我的事情。我甚至不知道我是如何最終使用'UnsafePointer'的。一切都如預期般運作。 –
Herickson
@NobodyNada,如果我們可以在'AudioFileGetProperty'中使用'NSDictionary',那麼使用'CFDictionary'的原因是什麼?有沒有辦法使用Swift Dictionary? (我試過[字符串:任何],它沒有填充鍵/值...)謝謝 –