関数から複数の値を迅速に返す


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 14

4
「Swiftプログラミング言語」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メソッドからその迅速な関数をどのように呼び出しますか?3つの戻り値へのハンドルを取得する方法に興味があります。たとえば、辞書を使用しますか?
フィル

1
あなたはしません。objcから呼び出したい場合は、クラス(おそらく構造体)を返す必要があります。
David Berry

5
パラメータに名前を追加することをお勧めします:func getTime()->(時間:Int、分:Int、秒:Int)次にgetTime()。hourのように取得します
Bruno Lemos

@BrunoLemosええと、私はまだより良い解決策に行くつもりです、それはTime構造体を定義してそれを使うことです。
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:間違っています。Swift2で名前のないタプルを返すと、Swift 1と同じように動作します。このスクリーンショットを参照してください。
Eric Aya

はい、あなたは正しいですが、類似のコンテキストでコンパイルエラーが発生します。私はそれを理由を見つける必要があります。
jtianling

コンパイルエラーは関係ありませんでした。それは、Swift 2で変更されたCalendarUnitフォーマットがタプルフォーマットではなく、原因でした。
Eric Aya、

そうではなくて、私が話したコンパイルエラーは自分でコードに現れました。
jtianling 2015

time.hourもう動作しません。コードを更新してください。
Lal Krishna

12

このメソッドから3つの異なる値を返し、このような1つの変数でこれら3つを取得する必要があります。

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を更新する

ここでは、タプルの使用法を実装し、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.