簡體   English   中英

Swift 5 我怎樣才能 hash 兩個 arrays

[英]Swift 5 How can I hash two arrays

如何使此代碼 SWIFT 接受? 我有兩個 arrays 類型的任何一個數組的值都應該作為鍵,另一個作為適當的值:

let it_tt_ar  = db.pair(keys: "int_test", values: "text_test");
func _pair<K : Hashable, V>(keys: [K], values: [V]) -> Dictionary<K,V> {
    
            var result = Dictionary<K, V>();

            for i in 0...(keys.count - 1) {
                result[keys[i]] = values[i];
            }

            return result;
    }
    
func pair (keys: String?, values: String?) -> Dictionary<Int32,Any> {
    
        if let _keys = keys, let _values = values {

            let result = _pair(keys: hashtable[_keys] as! [Int32], values: hashtable[_values]!);
            
            return result;
            
        } else {
            
            return [:];
        }
    }

如果密鑰的類型未知,我將無法正常工作。 我想這樣寫:

let it_tt_ar  = db.pair<Int32,String>(keys: "int_test", values: "text_test");

or

let it_tt_ar  = db.pair(keys: "int_test", values: "text_test", kt:(Int32.self,String.self));

... in the last case by catching kt: in the function

但似乎沒有機會贏得 SWIFT:

  • 不能指定泛型函數或
  • Int32 無法滿足可散列協議

它是可怕的! 您想編寫應用程序邏輯,但 80% 的開發時間都浪費在必須滿足這些規則上!

看起來您正在嘗試將一對 arrays 轉換為字典,而不管數組的類型如何(當然,前提是鍵數組元素的類型是可散列的)。 這是一種方法:

let k : [Int] = [1,2,3]
let v : [String] = ["one", "two", "three"]

func pair<Key, Value>(keyArray keys:[Key], valueArray values:[Value]) -> Dictionary<Key,Value> where Key:Hashable {
    zip(keys,values).reduce(into: Dictionary<Key,Value>()) { 
        (dict, tuple) in dict[tuple.0] = tuple.1
    }
}
let result = pair(keyArray: k, valueArray: v)
print(result) // [1: "one", 2: "two", 3: "three"], in some order

找到了一個適合我的解決方案:

var db = try DataBaseSqlite(dbfile: "test.db");

try db.select(sql: "int_test, real_test, text_test from stest");

var it = db.valueByKey(key: "int_test");
var rt = db.valueByKey(key: "real_test");
var tt = db.valueByKey(key: "text_test");

let it_tt_ar  = db.pair(keys: "int_test", values: "text_test", kt: Int32.self);
let tt_it_ar  = db.pair(keys: "text_test", values: "int_test", kt: String.self);

try db.close();
func _pair<K : Hashable, V>(keys: [K], values: [V]) -> Dictionary<K,V> {
    
            var result = Dictionary<K, V>();

            for i in 0...(keys.count - 1) {
                result[keys[i]] = values[i];
            }

            return result;
    }
    
    func pair<T>(keys: String?, values: String?, kt: T.Type) -> Dictionary<T,Any> {
    
        if let _keys = keys, let _values = values {

            let result = _pair(keys: hashtable[_keys] as! [T], values: hashtable[_values]!);
            
            return result;
            
        } else {
            
            return [:];
        }
    }

由於 Swift 中缺乏真正的哈希表支持(就像 c# 一樣),我的哈希表只是 <String,Array> 的字典,它是由 select 方法自動構建的。 因此,從應用程序的角度來看,我可以編寫更高效和通用的代碼來查詢 sqlite 數據庫。

dbValueByKey() 返回列值的類型化(請求)數組,而 pair() 僅返回兩列的組合。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM