How can I extend typed Arrays in Swift? -
How can I extend typed Arrays in Swift? -
how can extend swift's array<t> or t[] type custom functional utils?
browsing around swift's api docs shows array methods extension of t[], e.g:
extension t[] : arraytype { //... init() var count: int { } var capacity: int { } var isempty: bool { } func copy() -> t[] } when copying , pasting same source , trying variations like:
extension t[] : arraytype { func foo(){} } extension t[] { func foo(){} } it fails build error:
nominal type t[] can't extended
using total type definition fails use of undefined type 't', i.e:
extension array<t> { func foo(){} } and fails array<t : any> , array<string>.
curiously swift lets me extend untyped array with:
extension array { func each(fn: (any) -> ()) { in self { fn(i) } } } which lets me phone call with:
[1,2,3].each(println) but can't create proper generic type extension type seems lost when flows through method, e.g trying replace swift's built-in filter with:
extension array { func find<t>(fn: (t) -> bool) -> t[] { var = t[]() x in self { allow t = x t if fn(t) { += t } } homecoming } } but compiler treats untyped still allows calling extension with:
["a","b","c"].find { $0 > "a" } and when stepped-thru debugger indicates type swift.string it's build error seek access string without casting string first, i.e:
["a","b","c"].find { ($0 string).compare("a") > 0 } does know what's proper way create typed extension method acts built-in extensions?
after while trying different things solution seems remove <t> signature like:
extension array { func find(fn: (t) -> bool) -> [t] { var = [t]() x in self { allow t = x t; if fn(t) { += t } } homecoming } } which works intended without build errors:
["a","b","c"].find { $0.compare("a") > 0 } arrays swift
Comments
Post a Comment