sweta srinivas
sweta srinivas

Reputation: 1

Swift : Program for addition of 2 numbers using closure

let fileName = ProcessInfo.processInfo.environment["OUTPUT_PATH"]!
FileManager.default.createFile(atPath: fileName, contents: nil, attributes: nil)
let fileHandle = FileHandle(forWritingAtPath: fileName)!

guard let number1 = Int((readLine()?.trimmingCharacters(in: .whitespacesAndNewlines))!)
else { fatalError("Bad input") }

guard let number2 = Int((readLine()?.trimmingCharacters(in: .whitespacesAndNewlines))!)
else { fatalError("Bad input") }

let res = let closure(number1: number1, number2: number2)

fileHandle.write(String(res).data(using: .utf8)!)
fileHandle.write("\n".data(using: .utf8)!)

This is given question. Want the addition sum in res, so that res can be printed. I'm new to swift. Kindly help. What is the extra code to be written without modifying the question?

Have tried following solutions :

if let res = closure(number1: number1, number2: number2){
    return number1+number2
}

and:

func closure(number1: Int, number2: Int) -> Int {
    return number1 + number2
}

Getting the following errors:

solution.swift:23:11: error: expected initial value after '='
let res = let closure(number1: number1, number2: number2)
          ^
solution.swift:23:10: error: consecutive statements on a line must be separated by ';'
let res = let closure(number1: number1, number2: number2)
         ^
         ;
solution.swift:23:22: error: consecutive statements on a line must be separated by ';'
let res = let closure(number1: number1, number2: number2)
                     ^
                     ;
solution.swift:23:15: error: type annotation missing in pattern
let res = let closure(number1: number1, number2: number2)
              ^
solution.swift:23:22: warning: expression of type '(number1: Int, number2: Int)' is unused
let res = let closure(number1: number1, number2: number2)

Upvotes: 0

Views: 4078

Answers (2)

Ankit Jayaswal
Ankit Jayaswal

Reputation: 5679

Closures are self-contained blocks of functionality that can be passed around and used in your code. Closures in Swift are similar to blocks in C and Objective-C and to lambdas in other programming languages.

Closures can capture and store references to any constants and variables from the context in which they are defined. This is known as closing over those constants and variables. Swift handles all of the memory management of capturing for you.

Reference: click here

Example:

For sorting you can define a simple function, and to pass it in as an argument to the sorted(by:) method:

let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]

func backward(_ s1: String, _ s2: String) -> Bool {
    return s1 > s2
}

var reversedNames = names.sorted(by: backward)
// reversedNames is equal to ["Ewa", "Daniella", "Chris", "Barry", "Alex"]

Rather than using a function you can write closure for that, as:

var reversedNames = names.sorted(by: { (s1: String, s2: String) -> Bool in
    return s1 > s2
})

Solution for your problem:

Either you write and use:

func closure(number1: Int, number2: Int) {
    return number1 + number2
}

let res = closure(number1: number1, number2: number2)

Or, you can implement:

let closure:((Int, Int) -> Int) = { (number1, number2) in return number1 + number2 }

let res = closure(number1: number1, number2: number2)

Upvotes: 2

Josef Zoller
Josef Zoller

Reputation: 951

Closures are really simple in Swift. Here is an example Closure for adding two numbers:

let closure:((Int, Int) -> Int) = { (number1, number2) in
    return number1 + number2
}

Just like with normal variables you set the type of a closure after a colon. In this case it's:

((Int, Int) -> Int)

which means: Take two Ints as parameters and return a Int.

Usage:

let firstNumber = 5
let secondNumber = 6

let additionResult = closure(firstNumber, secondNumber)
//additionResult is 11

In your specific use case:

let closure:((Int, Int) -> Int) = { (number1, number2) in
    return number1 + number2
}

let fileName = ProcessInfo.processInfo.environment["OUTPUT_PATH"]!
FileManager.default.createFile(atPath: fileName, contents: nil, attributes: nil)
let fileHandle = FileHandle(forWritingAtPath: fileName)!

guard let number1 = Int((readLine()?.trimmingCharacters(in: .whitespacesAndNewlines))!)
else { fatalError("Bad input") }

guard let number2 = Int((readLine()?.trimmingCharacters(in: .whitespacesAndNewlines))!)
else { fatalError("Bad input") }

let res = closure(number1, number2)

fileHandle.write(String(res).data(using: .utf8)!)
fileHandle.write("\n".data(using: .utf8)!)

Upvotes: 3

Related Questions