字符序列的扩展,其中值是Equatable

时间:2017-02-27 15:14:19

标签: swift sequence extension-methods equatable

我试图通过比较它们的特定键来实现以下方法来删除字典数组中的双重条目。但是,由于错误,此扩展方法将无效:

  

二元运算符==不能应用于两个'Equatable'操作数

这些显然是等同的和相同类型(Iterator.Element.Value),所以为什么它不起作用?

我看到它将Equatable视为特定类型,而不是约束。我无法使用泛型类型或编写 public Cursor getId(String tableName) { String query = ("insert into trip tmid select mid from member"); SQLiteDatabase db = this.getWritableDatabase(); Cursor c = db.rawQuery(query,null); return c; } //this in my main activity //calling cursor public void onClick(View v) { long isInserted = myDb.createride(etfrom.getText().toString(), etto.getText().toString(), etdate.getText().toString(), ettime.getText().toString(), etpick.getText().toString(), etcost.getText().toString(), etseat.getText().toString()); if (isInserted > 0){ Cursor cursor = myDb.getId(myDb.TABLE_MEMBER); startManagingCursor(cursor); while(cursor.move(0)) { int id = cursor.getInt(0); } //this is how i using to get value to table public long createride(String from_trip,String to_trip,String date,String time,String pickup,String cost,String seats) { SQLiteDatabase db = this.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(KEY_FROM,from_trip); values.put(KEY_TO,to_trip); values.put(KEY_DATE,date); values.put(KEY_TIME,time); values.put(KEY_PICKUP,pickup); values.put(KEY_SEATS,seats); values.put(KEY_SEAT_COST,cost); long insertId = db.insert(TABLE_TRIP, null, values); return insertId; }

你们有没有关于如何解决这个问题的线索?

where Iterator.Element == [String: Any], Iterator.Element.Value: Equatable

1 个答案:

答案 0 :(得分:0)

[String: Equatable]是字符串到任何 Equatable类型的映射。没有承诺每个值都是相同的 equatable类型。也就是说,实际上不可能创建这样的字典(因为Equatable具有关联的类型),因此这个扩展不能应用于Swift中的任何实际类型。 (这里没有收到错误的事实是IMO编译器中的错误。)

您需要执行此功能的功能是SE-0142,该功能已被接受,但未实现。您目前无法通过这种方式基于类型约束来约束扩展。

有很多方法可以实现您的目标。一种直接的方法是传递你的相等函数:

extension Sequence {
    public func removeDoubles(with equal: (Iterator.Element, Iterator.Element) -> Bool) -> [Iterator.Element] {
        var noDoubles: [Iterator.Element] = []
        for item in self {
            if !noDoubles.contains(where: { equal($0, item) }) {
                noDoubles.append(item)
            }
        }
        return noDoubles
    }
}

let noDupes = dict.removeDoubles(with: { $0["name"] == $1["name"] })

这与您的代码在缺少name时的行为方式略有不同,但稍微调整可能会得到您想要的结果。

尽管如此,对此的需求强烈暗示了不正确的数据模型。如果你有这个字典序列,而你正试图在其上构建一个扩展,那么你几乎肯定会有一系列结构。然后这变得更加直截了当。字典的要点是键到值的任意映射。如果你有一小组已知的合法密钥,那真的是一个结构。