स्विफ्ट में एक फ़ंक्शन से कई मान लौटाएं


148

मैं स्विफ्ट में एक फ़ंक्शन से एक ही प्रकार (इंट) के 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 (ऑब्जेक्ट्स: घंटा, मिनट, सेकंड)
अमरो शफी

4
"स्विफ्ट प्रोग्रामिंग लैंग्वेज" iBook में वास्तव में "फंक्शन्स विद मल्टीपल रिटर्न वैल्यूज़" नामक एक सेक्शन है ...
मार्टिन आर

जवाबों:


312

टपल लौटें:

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

यह ऐप्पल द्वारा लिखित पुस्तक द स्विफ्ट प्रोग्रामिंग लैंग्वेज में इसका उपयोग करने का मानक तरीका है।

या जैसे:

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: गलत, स्विफ्ट 2 में एक अनाम टपल लौटना स्विफ्ट 1 के साथ ही काम करता है । इस स्क्रीनशॉट को देखें ।
एरिक आया

हाँ, आप सही हैं, लेकिन मुझे समानता के संदर्भ में एक संकलन त्रुटि मिलती है। मुझे इसे ढूंढना चाहिए।
jtianling

संकलित त्रुटि संबंधित नहीं थी, यह इसलिए था क्योंकि कैलेंडरउपनीत प्रारूप स्विफ्ट 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

अद्यतन स्विफ्ट 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 है
धवल निमावत
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.