[英]Swift 3 - Working with UnsafePointer<CFDictionary>?
我目前正在閱讀Chris Adamson的“學習核心音頻”並嘗試在Swift 3 (而不是Objective-C )中繼續學習。
第一個代碼示例使用AudioTool
來收集有關音頻文件的信息。 我的Swift 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
調用傳遞)。 現在我問自己如何能夠顯示存儲在outDataPointer
的數據。
這就是我理解這種情況的方法: outDataPointer
包含一個帶有關聯類型UnsafePointer<CFDictionary>
。 我能夠驗證outDataPointer
不是nil
,因此訪問相關值不會導致我的程序崩潰。 outDataPointer!.pointee
應該給我一個由outDataPointer
背后的關聯值指向的CFDictionary
。 CFDictionary
可以轉換為NSDictionary
。
遺憾的是,傾銷了下層數據
- __NSAtom#0
到控制台。 不是我所期望的(關於audiofile的信息)。 如何從outDataPointer
變量中獲取此數據?
Swift的CFDictionary
本身不是一個數據結構; 它是指向數據結構的指針,它等同於Objective-C的CFDictionaryRef
。 換句話說,它的行為類似於Swift class
,而不是struct
。
寫入outDataPointer
的值不是指向CFDictionary
的指針; 這是一個CFDictionary
。 您將其解除引用次數太多次,導致存儲在字典中的數據被視為指向字典的指針。 在我的系統上,生成的內存地址為0x001dffffc892e2f1
,Objective-C將其視為標記指針 ,從而生成NSAtom
消息。
要解決此問題, outDataPointer
聲明為CFDictionary?
而不是UnsafePointer<CFDictionary>?
:
// Get metadata
var outDataPointer: CFDictionary? = nil
possibleError = AudioFileGetProperty(audiofile!, kAudioFilePropertyInfoDictionary, &outDataSize, &outDataPointer)
assert(possibleError == noErr)
let outData = outDataPointer! as NSDictionary
dump(outData)
輸出:
▿ 1 key/value pair #0
▿ (2 elements)
- .0: approximate duration in seconds #1
- super: __NSCFString
- super: NSMutableString
- super: NSString
- super: NSObject
- .1: 187.387 #2
- super: NSString
- super: NSObject
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.