Tôi cảm thấy rằng tôi phải thiếu điều gì đó hiển nhiên. Phân hủy một danh sách vào đầu và đuôi và sau đó đệ quy trên đuôi là một kỹ thuật lập trình chức năng tiêu chuẩn, nhưng tôi đang đấu tranh để làm điều này cho Sliceable
các loại trong Swift.Đuổi qua Swift Sliceable
Tôi có một hàm đệ quy mà sau mô hình này:
func recurseArray(arr: [Int]) -> [Int] {
guard let first = arr.first else {
return []
}
let rest = recurseArray(Array(dropFirst(arr)))
let next = rest.first ?? 0
return [first + next] + rest
}
Rõ ràng là mã thực hiện rất nhiều hơn thêm mỗi số tiếp theo.
Lưu ý cuộc gọi đến Array(dropFirst(seq))
. Việc chuyển đổi sang một mảng là bắt buộc vì dropFirst
thực sự trả về một số ArraySlice
và ArraySlice
không phải là Sliceable
, vì vậy tôi không thể chuyển nó vào chức năng của mình.
Tôi không chắc loại trình tối ưu hóa nào của trình biên dịch có khả năng ở đây, nhưng dường như với tôi việc tạo mảng mới từ SubSlice
không cần thiết sẽ không tối ưu. Có một giải pháp cho điều này?
Bên cạnh đó, những gì tôi muốn thực sự muốn làm là tạo ra một phiên bản của chức năng này có thể mất bất cứ Sliceable
loại:
func recurseSeq<T: Sliceable where T.Generator.Element == Int>(list: T) -> [Int] {
guard let first = list.first else {
return []
}
let rest = recurseSeq(dropFirst(list)) // <- Error - cannot invoke with argument type T.SubSlice
let next = rest.first ?? 0
return [first + next] + rest
}
Lần này tôi không có một giải pháp cho thực tế là tôi có một số SubSlice
. Làm thế nào tôi có thể đạt được mục tiêu của mình?
Vì vậy, tôi đã ít nhất là một phần trên đúng hướng :) - Bạn có thể thêm một liên kết để đăng bài diễn đàn devoper? –
OK, nhưng vì bạn phải là nhà phát triển, tôi không chắc liệu điều đó có hữu ích cho đối tượng chung hay không. – tarmes
Tôi cho rằng nhiều người đang hoạt động trong thẻ [swift] có tài khoản nhà phát triển Apple. –