คืนค่าหลายค่าจากฟังก์ชั่นอย่างรวดเร็ว


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 มีส่วนที่ชื่อ "ฟังก์ชั่นที่มีค่าที่ส่งคืนหลาย" ...
มาร์ติน R

คำตอบ:


312

คืน tuple:

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

จากนั้นจะเรียกใช้เป็น:

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

หรือ:

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

25
โปรดทราบว่าทางออกที่ดีกว่าอาจเป็นการกำหนด Time โครงสร้างและใช้สิ่งนั้นแทนการ tuple
David Berry เมื่อ

1
คุณจะเรียกวิธีนี้ว่า swift func จากวิธี C แบบมีวัตถุประสงค์ได้อย่างไร? อยากรู้ว่าคุณจะได้รับหมายเลขอ้างอิงถึงค่าที่ส่งคืนสามค่าอย่างไร ยกตัวอย่างเช่นคุณใช้พจนานุกรมไหม
ฟิล

1
คุณจะไม่ ถ้าคุณต้องการโทรจาก objc คุณต้องส่งคืนคลาส (อาจจะเป็น struct) ไม่แน่ใจ
David Berry

5
ขอแนะนำให้เพิ่มชื่อให้กับพารามิเตอร์: func getTime () -> (ชั่วโมง: Int, นาที: Int, second: Int) จากนั้นรับเช่น getTime (). ชั่วโมง
Bruno Lemos

@BrunoLemos เอ๊ะฉันจะไปกับทางออกที่ดีกว่าคือการกำหนด Time struct และใช้มัน
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 ที่เขียนโดย 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: ผิดการส่งคืน tuple ที่ไม่มีชื่อใน Swift 2 จะทำงานเช่นเดียวกับ Swift 1 ดูภาพหน้าจอนี้
Eric Aya

ใช่คุณพูดถูก แต่ฉันได้รับข้อผิดพลาดในการคอมไพล์ในบริบทความคล้ายคลึงกัน ฉันควรหาว่าทำไม
jtianling

ข้อผิดพลาดในการคอมไพล์ไม่เกี่ยวข้องเนื่องจากเป็นรูปแบบ CalendarUnit ที่มีการเปลี่ยนแปลงใน Swift 2 ไม่ใช่รูปแบบ tuple
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

อัปเดต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
Dhaval Nimavat
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.