2017-03-14 8 views
0

CFDictionaryの特定の(または任意の)キーにアクセスする際に問題があります。 正直なところ...私は本当にあなたがスウィフトでこれを行うために必要な方法を取得していないと私はそれが過度に複雑だと思うCFDictionaryがSwift3のキーの値を取得する

マイコード:値を取得します。私が達成したい何

if let session = DASessionCreate(kCFAllocatorDefault) { 
let mountedVolumes = FileManager.default.mountedVolumeURLs(includingResourceValuesForKeys: [], options: [])! 
for volume in mountedVolumes { 
    if let disk = DADiskCreateFromVolumePath(kCFAllocatorDefault, session, volume as CFURL) { 
     let diskinfo = DADiskCopyDescription(disk); 

     var volumeValue = CFDictionaryGetValue(diskinfo, <#T##key: UnsafeRawPointer!##UnsafeRawPointer!#>) 


    } 
} 

キーまたはフィールドDAVolumeNetworkを変数volumeValueに入力します。 kDADiskDescriptionVolumeNetworkKeyに転送する必要がありますか?CFDictionaryGetValueメソッド?これをどのように達成するのですか?

答えて

2

スウィフトでCFDictionaryを使用しないでください。 (これは、以下を参照してください、価値の努力も可能ですが、ありません。)

  • CFDictionaryはフリーダイヤル NSDictionaryで架橋、今度はスウィフトDictionaryにキャストすることが可能です。
  • kDADiskDescriptionVolumeNetworkKeyキーの値は、 CFBooleanであり、Swift Boolにキャストできます。

例:

if let session = DASessionCreate(kCFAllocatorDefault), 
    let mountedVolumes = FileManager.default.mountedVolumeURLs(includingResourceValuesForKeys: []) { 
    for volume in mountedVolumes { 
     if let disk = DADiskCreateFromVolumePath(kCFAllocatorDefault, session, volume as CFURL), 
      let diskinfo = DADiskCopyDescription(disk) as? [NSString: Any] { 

      if let networkValue = diskinfo[kDADiskDescriptionVolumeNetworkKey] as? Bool { 
       print(networkValue) 
      } 
     } 
    } 
} 

ただ、完全を期すために:これはスウィフト3でCFDictionaryGetValueを呼び出すために必要なポインタ ジャグリングです:

if let session = DASessionCreate(kCFAllocatorDefault), 
    let mountedVolumes = FileManager.default.mountedVolumeURLs(includingResourceValuesForKeys: []) { 
    for volume in mountedVolumes { 
     if let disk = DADiskCreateFromVolumePath(kCFAllocatorDefault, session, volume as CFURL), 
      let diskinfo = DADiskCopyDescription(disk) { 

      if let ptr = CFDictionaryGetValue(diskinfo, Unmanaged.passUnretained(kDADiskDescriptionVolumeNetworkKey).toOpaque()) { 
       let networkValue = Unmanaged<NSNumber>.fromOpaque(ptr).takeUnretainedValue() 
       print(networkValue.boolValue) 
      } 
     } 
    } 
} 
+0

は、説明やコードをありがとう!私はまだCFDictionaryを取得していませんが、便利なものにキャストできればいいです。 – nja

+1

@nja:CFDictionaryはvoidポインタを渡してC APIを使います。 (Objective-)Cでは、単純にvoidポインタのオブジェクトポインタを渡すことができ、その逆もあります。あなたはそれをSwiftで行うことはできず、代わりにUnmanagedタイプを使用する必要があります。http://stackoverflow.com/questions/33294620/how-to-cast-self-to-sunsafemutablepointervoid-type-in​​-swiftを比較してください。 –

+0

CFDictionaryはNSDictionaryでフリーダイヤルされており、これはSwiftで値を取得する最も簡単な方法です:https://stackoverflow.com/a/45625787/225810 – Gabriel

0

あなたはCFDictionaryRefをキャストすることができますスウィフト辞書へ:

if let disk = DADiskCreateFromVolumePath(kCFAllocatorDefault, session, volume as CFURL), let diskinfo = DADiskCopyDescription(disk) as? [String: AnyObject] { 
} 

、その後スウィフト文字列にkDADiskDescriptionVolumeNetworkKeyをキャスト:

var volumeValue = diskinfo[kDADiskDescriptionVolumeNetworkKey as String] 
+0

CFDictionaryをSwift辞書にキャストするのは高価ですフリーダイヤル)。 NSDictionaryにキャストし、それを使用するのがベストです:https://stackoverflow.com/a/45625787/225810 – Gabriel

関連する問題