2015-09-30 16 views
8

Như một bài tập, tôi đang cố gắng viết bản đồ, thời lượng và bộ lọc làm chức năng giảm.Swift viết bản đồ, độ dài, bộ lọc làm giảm

func map<T>(array: [T], f: (T->T)) -> [T] { 
    return array.reduce([]) { 
     (var seed, value) in 
     seed.append(f(value)) 
     return seed 
    } 
} 

func length<T>(array: [T]) -> Int { 
    return array.reduce(0){ (x,_) in x + 1 } 
} 

func filter<T>(array: [T], predicate: (T->Bool)) -> [T]{ 
    return array.reduce([]){ 
     (var seed, value) in 
     if predicate(value){ 
      seed.append(value) 
     } 
     return seed 
    } 
} 

Đây có phải là cú pháp thanh lịch nhất mà tôi có thể sử dụng để viết lại các hàm đó làm giảm không? Câu hỏi thứ 2: Bản đồ có chức năng f: (T-> T) Về cơ bản loại nói tôi chỉ có thể trả về kiểu T, nhưng nếu hàm tôi viết biến đổi kiểu T thành Bool, hoặc Int ... Làm cách nào để thực hiện việc này? Có vẻ như bản đồ không tồn tại

Trả lời

6

Đối với một ánh xạ mà biến đổi một loại T thành một (có thể khác nhau) gõ S chỉ cần sử dụng hai loại placeholders:

func map<T, S>(array: [T], f: (T->S)) -> [S] { 
    return array.reduce([]) { 
     (var seed, value) in 
     seed.append(f(value)) 
     return seed 
    } 
} 

Ví dụ:

let x = map([1, 2, 3], f: { String($0) }) 
print(x) // ["1", "2", "3"] 

Cho dù điều này "là cú pháp thanh lịch nhất" cũng là một vấn đề về ý kiến ​​cá nhân. Nếu bạn thay thế các phương pháp append() bởi mảng nối với + sau đó các thông số seed cần không biến:

func map<T, S>(array: [T], f: (T->S)) -> [S] { 
    return array.reduce([]) { 
     (seed, value) in 
     seed + [f(value)] 
    } 
} 

Mà có thể được viết với những cái tên tham số viết tắt như

func map<T, S>(array: [T], f: (T->S)) -> [S] { 
    return array.reduce([]) { $0 + [ f($1) ] } 
} 

Tương tự:

func filter<T>(array: [T], predicate: (T->Bool)) -> [T]{ 
    return array.reduce([]) { predicate($1) ? $0 + [ $1 ] : $0 } 
} 

Chỉ cần lưu ý rằng việc triển khai map()filter() sử dụng reduce() (thay vì vòng lặp) không hiệu quả vì một mảng mới mới được tạo trong mỗi bước giảm. Xem ví dụ

cho việc phân tích. Để thực hiện bài tập (như bạn đã nói), bạn chỉ cần không sử dụng thứ gì đó như thế này trong quá trình sản xuất).

+0

Muchas gracias, cảm ơn! Chính xác loại phản hồi tôi đang tìm kiếm. Swift là một cảnh quan kỳ lạ ngay từ đầu;) – Seneca

+0

Cảnh quan kỳ lạ đã truyền cảm hứng cho bạn để thử điều này!?! :) – Grimxn

+0

Rõ ràng có tồn tại một cái gì đó giống như đầu dò;) Cách tuyệt vời để có được một số kiến ​​thức cơ bản về nhanh chóng. – Seneca

0

mở rộng CollectionType

extension CollectionType { 
func MyMap<T>(transform: (Self.Generator.Element) -> T) -> [T] { 
    let list = self.reduce([T]()) { (var seed, value) in 
     seed.append(transform(value)) 
     return seed 
    } 
    return list 
}} 

sau đó sử dụng [1,2,3] .MyMap ({$ 0 + 1})

Các vấn đề liên quan