2016-01-08 23 views
6

Tình huống phổ biến nhất mà bạn muốn trả về một hàm từ một hàm trong Swift là gì?Khi nào để trả về một hàm từ một hàm khác trong Swift

Trong mã bên dưới, tôi trả về một hàm nhưng tôi không thực sự thấy mục đích vì hàm tôi đang quay lại nằm bên trong hàm đang trả về hàm đó. Lý do tôi bối rối là bởi vì chúng ta có thể thực hiện điều tương tự chỉ với một chức năng.

func person() -> ((String, Int) -> String) { 

    func info(name: String, age: Int) -> (String) { 
    return "\(name) is \(age) old" 
    } 

    return info 
} 


let nathan = person() 
nathan("Nathan", 3) 

print(nathan("Nathan", 3)) 

Ai đó có thể chỉ ra các tình huống phổ biến mà bạn muốn trả về hàm và có thể minh họa một ví dụ tốt hơn?

Tôi muốn hiểu điều này vì đây là nền tảng cho lập trình nói chung không chỉ Swift (tôi nghĩ).

+2

Đây là một khái niệm lập trình chức năng, không nhất thiết phải là cơ sở cho lập trình. Bạn nên đọc về Lập trình chức năng và khái niệm 'currying'. Xem liên kết này ví dụ: https://en.wikipedia.org/wiki/Currying Một trong những lợi thế là mỗi chức năng chỉ có trong 1 đối số. –

+6

@LaurentRivard lưu ý rằng việc cắt cà ri sẽ có khả năng bị xóa khỏi swift: https://github.com/apple/swift-evolution/blob/master/proposals/0002-remove-currying.md – luk2302

+0

Hãy xem [câu trả lời của tôi ở đây] (http://stackoverflow.com/a/34566757/2442804) cho một ví dụ về cách sử dụng các chức năng đóng như thực tế trả về/sử dụng đối tượng – luk2302

Trả lời

6

Một ví dụ cổ điển sẽ là trong một chương trình máy tính, ví dụ:

func operatorForString(str: String) -> ((Float, Float) -> Float)? { 
    if str == "+" { 
     return (+) // brackets required to clarify that we mean the function 
    } else if str == "-" { 
     return (-) 
    } else if str == "*" { 
     return (*) 
    } else if str == "/" { 
     return (/) 
    } else if str == "**" { 
     return pow // No brackets required here 
    } else { 
     return nil 
    } 
} 

if let op = operatorForString("-") { 
    let result = op(1, 2) // -1 
} 

Nó khá giả tạo, nhưng nó minh họa nguyên tắc đơn giản là ...

Là một "tập thể dục cho người đọc" cố gắng làm điều đó như một tra cứu Dictionary, thay vì lặp lại if s :)

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