185 похожих чатов

Hello guys! Does someone know how to make this work?

(error in the pic)
Also, is it possible to replace any Hashable to something like type param pack in Swift 5.9?

9 ответов

11 просмотров

afaik KeyPath must always be concrete

Куся 🌿⃤ __UKS
Exact?

say you have property myArray: Int[] (which conforms to Collection), that doesn't mean you can safely assign a dictionary [String: Float] to it just because the dictionary is also a Collection (yet key path is still KeyPath<MyClass, any Collection>. get the idea?

I guess you can experiment with parameter packs, for example this works import Foundation func hash<T, each P: Hashable>( _ item: T, props: repeat KeyPath<T, each P> ) -> Int { var hasher = Hasher() repeat (hasher.combine(item[keyPath: each props])) return hasher.finalize() } struct Example { var p1 = 0 var p2 = true var p3 = "string" } print( hash(Example(), props: \.p1, \.p2, \.p3), hash(Example(), props: \.p1, \.p2, \.p3), hash(Example(), props: \.p1, \.p2), separator: "\n" ) Output: -4549848955267135610 -4549848955267135610 3558766014151656816

Kirill Titov
try writing to WritableKeyPath with protocol

Well I guess it might not work, but this will (at least you can declare another overload in isolation from the logic) public struct HashingPath<Root> { @usableFromInline internal let _extract: (Root) -> AnyHashable @inlinable public init<Value: Hashable>(_ path: @escaping (Root) -> Value) { self._extract = { path($0) } } // You can declare more overloads here @inlinable public func extract(from root: Root) -> AnyHashable { return _extract(root) } } public func hash<T>(_ item: T, props: [HashingPath<T>]) -> Int { return props.reduce(into: Hasher()) { hasher, prop in hasher.combine(prop.extract(from: item)) }.finalize() }

Kirill Titov
try writing to WritableKeyPath with protocol

Btw this works with the first implementation struct Example { var string: String = "" var protocolValue: any Hashable = 0 } hash(Example(), props: \.string, { AnyHashable($0.protocolValue) })

Maxim Krouk
Btw this works with the first implementation stru...

так, стой, у тебя тип свойства структуры — протокол (ставить туда ты можешь любое значение с этим протоколом). но ты не можешь писать в конкретное значение протокольное значение. WritableKeyPath туда тоже не запишет ничего

Kirill Titov
так, стой, у тебя тип свойства структуры — протоко...

Так изначально проблема не подразумевала запись, но вообще по идее решение со структурой будет нормально работать

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Ребят в СИ можно реализовать ООП?
Николай
33
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
2
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Карта сайта