Швидко повертайте декілька значень з функції


148

Як повернути 3 окремі значення даних одного типу (Int) з функції у швидкій формі?

Я намагаюся повернути час доби, мені потрібно повернути Час, Хвилину та Друге як окремі цілі числа, але все в один перехід від однієї і тієї ж функції, чи це можливо?

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

Будь-яка допомога буде дуже вдячна!

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
У iBook "Швидкої мови програмування" насправді є розділ під назвою "Функції з кількома зворотними значеннями" ...
Martin R

Відповіді:


311

Повернути кортеж:

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

Потім він викликається як:

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

або:

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

25
Зауважте, що кращим рішенням може бути визначення структури часу та використання її замість кортежу.
Девід Беррі

1
Як би ви назвали цей швидкий функція від об'єктивного методу С? Цікаво, як ви отримаєте ручку на три повернені значення. Чи використовуєте ви, наприклад, словник?
філ

1
Ви б не зробили. Якщо ви хочете зателефонувати йому з objc, ви повинні повернути клас (можливо, структуру) не впевнений.
Девід Беррі

5
Рекомендується додати ім’я до параметрів: func getTime () -> (година: Int, хвилина: Int, секунда: Int) Тоді отримайте як getTime (). Годину
Бруно Лемос

@BrunoLemos так, я все одно буду краще рішення - це визначити структуру часу і використовувати це.
Девід Беррі

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

Це стандартний спосіб його використання в книзі The Swift Programming Language, написаній 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, а не формат кортежу.
Ерік Айя

Не так, як помилка компіляції, про яку я говорив, з’явилася в коді сама.
jtianling

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

Швидкий 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.