Возврат нескольких значений из функции в swift


148

Как вернуть 3 отдельных значения данных одного и того же типа (Int) из функции в swift?

Я пытаюсь вернуть время суток, мне нужно вернуть Час, Минуту и ​​Секунду в виде отдельных целых чисел, но все ли в одном переходе от одной и той же функции, возможно ли это?

Я думаю, что я просто не понимаю синтаксис для возврата нескольких значений. Это код, который я использую, у меня проблемы с последней (возвратной) строкой.

Любая помощь будет принята с благодарностью!

func getTime() -> Int
{
    let date = NSDate()
    let calendar = NSCalendar.currentCalendar()
    let components = calendar.components(.CalendarUnitHour | .CalendarUnitMinute | .CalendarUnitSecond, fromDate: date)
    let hour = components.hour
    let minute = components.minute
    let second = components.second
    let times:String = ("\(hour):\(minute):\(second)")
    return hour, minute, second
}

1
вернуть NSArray (объекты: час, минута, секунда)
Amro Shafie

4
«Язык программирования Swift» В iBook фактически есть раздел под названием «Функции с несколькими возвращаемыми значениями» ...
Мартин Р,

Ответы:


312

Вернуть кортеж:

func getTime() -> (Int, Int, Int) {
    ...
    return ( hour, minute, second)
}

Тогда это вызывается как:

let (hour, minute, second) = getTime()

или:

let time = getTime()
println("hour: \(time.0)")

25
Обратите внимание, что лучшим решением может быть определение структуры Time и использование ее вместо кортежа.
Дэвид Берри

1
Как бы вы назвали этот быстрый метод из объективного метода Си? Любопытно, как вы получите дескриптор трех возвращаемых значений. Вы бы использовали словарь, например?
Фил

1
Вы бы не. Если вы хотите вызвать его из objc, вы должны вернуть класс (возможно, структуру), не уверен.
Дэвид Берри

5
Рекомендуется добавить имя к параметрам: func getTime () -> (час: Int, минута: Int, секунда: Int) Затем получить как getTime (). Hour
Bruno Lemos

@ BrunoLemos Да, я все еще собираюсь пойти с лучшим решением, чтобы определить структуру Time и использовать ее.
Дэвид Берри

75

Также:

func getTime() -> (hour: Int, minute: Int,second: Int) {
    let hour = 1
    let minute = 2
    let second = 3
    return ( hour, minute, second)
}

Тогда это вызывается как:

let time = getTime()
print("hour: \(time.hour), minute: \(time.minute), second: \(time.second)")

Это стандартный способ его использования в книге «Язык программирования Swift», написанной Apple.

или просто так:

let time = getTime()
print("hour: \(time.0), minute: \(time.1), second: \(time.2)")

это то же самое, но менее ясно.


1
the right answer can't compile right in swift 2.0: неправильно, возвращение безымянного кортежа в Swift 2 работает так же, как и в Swift 1. Смотрите этот скриншот .
Эрик Айя

да, вы правы, но я получаю ошибку компиляции в контексте сходства. Я должен найти это почему.
jtianling

Ошибка компиляции не была связана с изменением формата CalendarUnit в Swift 2, а не с форматом кортежей.
Эрик Айя

Не так, ошибка компиляции, о которой я говорил, появилась в коде сама.
Джианлинг

time.hourбольше не будет работать Пожалуйста, обновите код.
Лал Кришна

12

Вы должны вернуть три разных значения из этого метода и получить эти три в одной переменной, как эта.

func getTime()-> (hour:Int,min:Int,sec:Int){
//your code
return (hour,min,sec)
}

получить значение в одной переменной

let getTime = getTime()

теперь вы можете получить доступ к часам, минутам и секундам просто с помощью "." то есть.

print("hour:\(getTime.hour) min:\(getTime.min) sec:\(getTime.sec)")

7

Swift 3

func getTime() -> (hour: Int, minute: Int,second: Int) {
        let hour = 1
        let minute = 20
        let second = 55
        return (hour, minute, second)
    }

Использовать :

let(hour, min,sec) = self.getTime()
print(hour,min,sec)

6

Обновление Swift 4.1

Здесь мы создаем структуру для реализации использования Tuple и проверки длины текста OTP. Это должно быть 2 поля для этого примера.

struct ValidateOTP {
var code: String
var isValid: Bool }

func validateTheOTP() -> ValidateOTP {
    let otpCode = String(format: "%@%@", txtOtpField1.text!, txtOtpField2.text!)
    if otpCode.length < 2 {
        return ValidateOTP(code: otpCode, isValid: false)
    } else {
        return ValidateOTP(code: otpCode, isValid: true)
    }
}

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

let isValidOTP = validateTheOTP()
    if isValidOTP.isValid { print(" valid OTP") } else {   self.alert(msg: "Please fill the valid OTP", buttons: ["Ok"], handler: nil)
    }

Надеюсь, поможет!

Спасибо


1
Для лучшего понимания: medium.com/@abhimuralidharan/tuple-in-swift-a9ddeb314c79
Harjot Singh

1
//By : Dhaval Nimavat
    import UIKit

   func weather_diff(country1:String,temp1:Double,country2:String,temp2:Double)->(c1:String,c2:String,diff:Double)
   {
    let c1 = country1
    let c2 = country2
    let diff = temp1 - temp2
    return(c1,c2,diff)
   }

   let result = 
   weather_diff(country1: "India", temp1: 45.5, country2: "Canada", temp2:    18.5)
   print("Weather difference between \(result.c1) and \(result.c2) is \(result.diff)")

Вывод: разница погоды между Индией и Канадой составляет 27,0
Дхавал Нимават,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.