News for hackers. Stuff that matters.
Re:What’s New in Swift 5.2 by melling on Thursday February 06, 2020 @02:05PM (#22259152)
I didn’t say it was impossible. I said “add more generic functionality“

That’s why I provided two examples containing different types to illustrate what I meant.

I don’t believe you can add a generic function to the array to handle this.

In another repo, I’ve used the FloatingPoint protocol with some luck. However, this should also work with Int’s, for instance:

    extension Array where Element: FloatingPoint  {
    
        var sum: Element {
           self.reduce(0, +)
        }
    }
https://github.com/melling/data-science-from-scratch-swift/b...
Re:What’s New in Swift 5.2 by NobodyNada on Thursday February 06, 2020 @02:16PM (#22259273)
> I don’t believe you can add a generic function to the array to handle this.

What’s wrong with something like this?

    extension Array {
        func take(_ n: Int) -> ArraySlice<Element> {
            self[0..<n]
        }
    }
For your other example, you can make the function accept an array of Ints by constraining Element to AdditiveArithmetic instead of FloatingPoint.
Re:What’s New in Swift 5.2 by rudedogg on Thursday February 06, 2020 @03:35PM (#22260008)
The example you didn't cover using AdditiveArithmetic is actually covered in the docs here: https://developer.apple.com/documentation/swift/additivearit...

    extension Sequence where Element: AdditiveArithmetic {
        func sum() -> Element {
            return reduce(.zero, +)
        }
    }
Re:What’s New in Swift 5.2 by melling on Thursday February 06, 2020 @02:24PM (#22259347)
I think you’re making my case for me. So, I’ll need a separate function for Ints, Strings, Floats... What if I have an Array of my custom Person objects?

   [1,2,3].take(2)
   [“a”,”b”,”c”].take(2)
   [p1,p2,p3].take(2)
How much logic are we going to need to repeat for all the types for all the functions?
Re:What’s New in Swift 5.2 by Tainnor on Thursday February 06, 2020 @02:51PM (#22259628)
there are holes in Swift's generics system, but this isn't one of them. you don't need separate extensions for int, string, float etc. arrays. the parent post gave you a generic implementation that works with any type of array
Re:What’s New in Swift 5.2 by melling on Thursday February 06, 2020 @04:21PM (#22260473)
Hmmm. I thought ArraySlice had different semantics. Why wouldn’t it be declared returning [Element]?

   extension Array {
          func take(_ n: Int) -> [Element] {
             self[0..<n]
          }
      }
Apple provides this warning for ArraySlice:

“Long-term storage of ArraySlice instances is discouraged. A slice holds a reference to the entire storage of a larger array, not just to the portion it presents, even after the original array’s lifetime ends. Long-term storage of a slice may therefore prolong the lifetime of elements that are no longer otherwise accessible, which can appear to be memory and object leakage.”

https://developer.apple.com/documentation/swift/arrayslice

Would it be acceptable to put these implementations in a Functional library?

Re:What’s New in Swift 5.2 by Someone on Thursday February 06, 2020 @05:49PM (#22261300)
Yes, it would. Returning an Array would require take to copy the data, slowing down your nice functional code.
Re:What’s New in Swift 5.2 by Tainnor on Friday February 07, 2020 @08:04PM (#22272904)
This is because Swift is quite low-level when it comes to storage etc., so [0..<n] returns an ArraySlice.

However, this has nothing to do with generics.If you're willing to sacrifice performance, you could easily write

  extension Array {
      func take(_ n: Int) -> [Element] {
          Array(self[0..<n])
      }
  }
Re:What’s New in Swift 5.2 by sixstringtheory on Thursday February 06, 2020 @02:47PM (#22259595)
FWIW I'm with you on this. I'm still waiting for the rest of the generics manifesto to, you know, manifest: https://github.com/apple/swift/blob/master/docs/GenericsMani...

That one and the need for generic associatedTypes trip me up all the time.

I think about it every time I see new feature announcements like today's. The opportunity cost of the wasted effort, the new thing that will probably make things harder for everyone. Possibly including those who try to fulfill the generics manifesto.