신속하게 함수에서 여러 값을 반환


148

신속하게 함수에서 동일한 유형 (Int)의 3 개의 개별 데이터 값을 어떻게 반환합니까?

하루 중 시간을 반환하려고하는데시, 분 및 초를 별도의 정수로 반환해야하지만 모두 동일한 기능에서 한 번에 가능합니까?

여러 값을 반환하는 구문을 이해하지 못한다고 생각합니다. 이것은 내가 사용하는 코드이며 마지막 (반환) 줄에 문제가 있습니다.

어떤 도움이라도 대단히 감사하겠습니다!

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 Programming Language"iBook에는 실제로 "여러 반환 값을 가진 함수"라는 제목의 섹션이 있습니다.
Martin R

답변:


312

튜플을 반환합니다 :

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

그런 다음 다음과 같이 호출됩니다.

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

또는:

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

25
더 나은 해결책은 Time 구조체를 정의하고 튜플 대신 이것을 사용하는 것입니다.
David Berry

1
객관적인 C 방법에서 그 빠른 기능을 어떻게 부를까요? 세 개의 반환 값을 처리하는 방법이 궁금합니다. 예를 들어 사전을 사용 하시겠습니까?
phil

1
당신은하지 않을 것입니다. objc에서 호출하려면 확실하지 않은 클래스 (아마도 구조체)를 반환해야합니다.
David Berry

5
매개 변수에 이름을 추가하는 것이 좋습니다. func getTime ()-> (시간 : Int, 분 : Int, 초 : Int) 그런 다음 getTime (). hour와 같이하십시오.
Bruno Lemos

@BrunoLemos 어, 나는 여전히 더 나은 해결책으로 갈 것입니다. 시간 구조체를 정의하고 사용하는 것입니다.
David Berry

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 책에서 그것을 사용하는 표준 방법입니다.

또는 그냥 :

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과 동일하게 작동합니다 . 이 스크린 샷을 참조하십시오 .
Eric Aya

예, 당신은 옳습니다. 그러나 비슷한 맥락에서 컴파일 오류가 발생합니다. 이유를 찾아야합니다.
jtianling

컴파일 오류는 관련이 없으며 튜플 형식이 아닌 Swift 2에서 CalendarUnit 형식이 변경 되었기 때문입니다 .
Eric Aya

그런 식으로 내가 말한 컴파일 오류는 코드에 직접 나타납니다.
jtianling

time.hour더 이상 작동하지 않습니다. 코드를 업데이트하십시오.
Lal Krishna '

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

스위프트 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
//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입니다
Dhaval Nimavat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.