SwiftでCFDictionary

SwiftはObj-Cに比べてより柔軟な書き方ができる反面、最適な書き方がよく分からない場合がある。省略できたりできなかったり。例えばCFDictionaryの場合。

よく見かけるコード

func clear() {
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword
    ]
    SecItemDelete(query as CFDictionary)
}

しかし、キーのStringキャストは消せる

func clear() {
    let query: [CFString: Any] = [
        kSecClass: kSecClassGenericPassword
    ]
    SecItemDelete(query as CFDictionary)
}

本当はこうしたいがエラーになる

func clear() {
    // Contextual type 'CFDictionary' cannot be used with dictionary literal
    let query: CFDictionary = [
        kSecClass: kSecClassGenericPassword
    ]
    SecItemDelete(query)
}

こうすると一番マシかも

func clear() {
    let query = [
        kSecClass: kSecClassGenericPassword
    ] as CFDictionary
    SecItemDelete(query)
}

ちなみにSwift 4.2