Tôi nhấn vào nó và làm việc xung quanh nó bằng cách sử dụng một phần mở rộng trên Dictionary
để tạo các bảng con tùy chỉnh.
extension Dictionary {
subscript(key: String) -> Value? {
get {
let anyKey = key as! Key
if let value = self[anyKey] {
return value // 1213ns
}
if let value = self[key.lowercased() as! Key] {
return value // 2511ns
}
if let value = self[key.capitalized as! Key] {
return value // 8928ns
}
for (storedKey, storedValue) in self {
if let stringKey = storedKey as? String {
if stringKey.caseInsensitiveCompare(key) == .orderedSame {
return storedValue // 22317ns
}
}
}
return nil
}
set {
self[key] = newValue
}
}
}
Thời gian trong nhận xét là từ điểm chuẩn khác nhau (tối ưu hóa xây dựng, -Os
, trung bình trên 1.000.000 lần lặp). Một truy cập tương đương của một từ điển tiêu chuẩn, xuất hiện ở 1257ns. Phải thực hiện hai lần kiểm tra hiệu quả gấp đôi, 2412ns.
Trong trường hợp cụ thể của tôi, tôi đã nhìn thấy một tiêu đề quay lại từ máy chủ là trường hợp lạc đà hoặc thấp hơn, tùy thuộc vào mạng tôi đang kết nối (điều gì khác cần điều tra). Ưu điểm của điều này là, nếu nó được cố định, tôi chỉ có thể xóa phần mở rộng và không có gì khác cần phải thay đổi. Ngoài ra, bất kỳ ai khác sử dụng mã không cần phải nhớ bất kỳ cách giải quyết nào - họ đều nhận được mã này miễn phí.
tôi đã kiểm tra và không thấy ETag
được sửa đổi bởi HTTPURLResponse
- nếu tôi thông qua nó ETag
, hoặc Etag
Tôi có những người trở lại trong allHeaderFields
. Trong trường hợp đó hiệu suất là một mối quan tâm, và bạn đang gặp phải vấn đề này, bạn có thể tạo một subscript thứ hai mà có một cấu trúc Hashable
chứa một mảng. Sau đó chuyển nó vào từ điển, với các thẻ bạn muốn xử lý.
struct DictionaryKey: Hashable {
let keys: [String]
var hashValue: Int { return 0 } // Don't care what is returned, not going to use it
}
func ==(lhs: DictionaryKey, rhs: DictionaryKey) -> Bool {
return lhs.keys == rhs.keys // Just filling expectations
}
extension Dictionary {
subscript(key: DictionaryKey) -> Value? {
get {
for string in key.keys {
if let value = self[string as! Key] {
return value
}
}
return nil
}
}
}
print("\(allHeaderFields[DictionaryKey(keys: ["ETag", "Etag"])])"
Đây là, như bạn mong đợi, gần như tương đương với việc tra cứu từ điển riêng lẻ.