Swift: программа для добавления 2 чисел с помощью замыкания - PullRequest
0 голосов
/ 05 мая 2018
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)!)

Это заданный вопрос. Требуется сумма сложения в res, чтобы можно было распечатать res. Я новичок в Свифте. Пожалуйста, помогите. Какой дополнительный код нужно написать без изменения вопроса?

Пробовали следующие решения:

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

и

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

Получение следующих ошибок:

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)

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

Закрытия действительно просты в Swift. Вот пример закрытия для добавления двух чисел:

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

Так же, как с обычными переменными, вы устанавливаете тип замыкания после двоеточия. В данном случае это:

((Int, Int) -> Int)

, что означает: взять два Ints в качестве параметров и вернуть Int.

Использование:

let firstNumber = 5
let secondNumber = 6

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

В вашем конкретном случае использования:

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)!)
0 голосов
/ 05 мая 2018

Замыкания - это автономные блоки функциональности, которые можно передавать и использовать в вашем коде. Замыкания в Swift похожи на блоки в C и Objective-C и на лямбды в других языках программирования.

Замыкания могут захватывать и хранить ссылки на любые константы и переменные из контекста, в котором они определены. Это называется закрытием этих констант и переменных. Swift обрабатывает все функции захвата памяти для вас.

Ссылка: нажмите здесь

Пример:

Для сортировки вы можете определить простую функцию и передать ее в качестве аргумента методу sorted(by:):

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"]

Вместо использования функции вы можете написать замыкание для этого, как:

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

Решение вашей проблемы:

Либо ты пишешь и пользуешься:

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

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

Или вы можете реализовать:

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

let res = closure(number1: number1, number2: number2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...