Trả về nhiều giá trị từ một hàm trong swift


148

Làm cách nào để trả về 3 giá trị dữ liệu riêng biệt cùng loại (Int) từ một hàm trong swift?

Tôi đang cố gắng trả lại thời gian trong ngày, tôi cần trả về Giờ, Phút và Thứ hai dưới dạng các số nguyên riêng biệt, nhưng tất cả trong một đi từ cùng một chức năng, điều này có khả thi không?

Tôi nghĩ rằng tôi không hiểu cú pháp trả về nhiều giá trị. Đây là mã tôi đang sử dụng, tôi gặp sự cố với dòng (trả lại) cuối cùng.

Mọi sự trợ giúp sẽ rất được trân trọng!

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
return NSArray (các đối tượng: giờ, phút, giây)
Amro Shafie 17/12/14

4
IBook "Ngôn ngữ lập trình Swift" thực sự có một phần có tiêu đề "Các hàm có nhiều giá trị trả về" ...
Martin R

Câu trả lời:


310

Trả lại một tuple:

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

Sau đó, nó được gọi là:

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

hoặc là:

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

25
Lưu ý rằng một giải pháp tốt hơn có thể là xác định cấu trúc Thời gian và sử dụng cấu trúc đó thay vì bộ dữ liệu.
David Berry

1
Làm thế nào bạn sẽ gọi func nhanh chóng đó từ một phương pháp C khách quan? Tò mò làm thế nào bạn sẽ có được một tay cầm đến ba giá trị được trả về. Bạn sẽ sử dụng một từ điển, ví dụ?
phil

1
Bạn sẽ không. Nếu bạn muốn gọi nó từ objc, bạn phải trả về một lớp (có thể là struct) không chắc chắn.
David Berry

5
Bạn nên thêm tên vào các tham số: func getTime () -> (giờ: Int, phút: Int, giây: Int) Sau đó lấy như getTime (). Giờ
Bruno Lemos

@BrunoLemos eh, tôi vẫn sẽ đi với giải pháp tốt hơn là xác định cấu trúc Thời gian và sử dụng cấu trúc đó.
David Berry

74

Cũng thế:

func getTime() -> (hour: Int, minute: Int,second: Int) {
    let hour = 1
    let minute = 2
    let second = 3
    return ( hour, minute, second)
}

Sau đó, nó được gọi là:

let time = getTime()
print("hour: \(time.hour), minute: \(time.minute), second: \(time.second)")

Đây là cách tiêu chuẩn để sử dụng nó trong cuốn sách Ngôn ngữ lập trình Swift do Apple viết.

hoặc giống như:

let time = getTime()
print("hour: \(time.0), minute: \(time.1), second: \(time.2)")

Nó giống nhau nhưng ít rõ ràng hơn.


1
the right answer can't compile right in swift 2.0: sai, trả về một bộ dữ liệu chưa được đặt tên trong Swift 2 hoạt động tương tự như với Swift 1. Xem ảnh chụp màn hình này .
Eric Aya

vâng, bạn đúng, nhưng tôi nhận được một lỗi biên dịch trong bối cảnh tương tự. Tôi nên tìm nó tại sao.
jtianling

Lỗi biên dịch không liên quan, đó là do định dạng CalendarUnit đã thay đổi trong Swift 2, không phải định dạng tuple.
Eric Aya

Không phải như vậy, lỗi biên dịch mà tôi đã nói đã xuất hiện trong mã.
jtianling

time.hoursẽ không làm việc nữa. Vui lòng cập nhật mã.
Lal Krishna

12

bạn nên trả về ba giá trị khác nhau từ phương thức này và nhận ba giá trị này trong một biến như thế này.

func getTime()-> (hour:Int,min:Int,sec:Int){
//your code
return (hour,min,sec)
}

lấy giá trị trong một biến

let getTime = getTime()

bây giờ bạn có thể truy cập giờ, phút và giây chỉ bằng cách "." I E.

print("hour:\(getTime.hour) min:\(getTime.min) sec:\(getTime.sec)")

7

Swift 3

func getTime() -> (hour: Int, minute: Int,second: Int) {
        let hour = 1
        let minute = 20
        let second = 55
        return (hour, minute, second)
    }

Để sử dụng:

let(hour, min,sec) = self.getTime()
print(hour,min,sec)

6

Cập nhật Swift 4.1

Ở đây chúng tôi tạo một cấu trúc để thực hiện việc sử dụng Tuple và xác thực độ dài văn bản OTP. Đó cần phải là 2 lĩnh vực cho ví dụ này.

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

Sử dụng:

let isValidOTP = validateTheOTP()
    if isValidOTP.isValid { print(" valid OTP") } else {   self.alert(msg: "Please fill the valid OTP", buttons: ["Ok"], handler: nil)
    }

Hy vọng nó giúp!

Cảm ơn



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

Đầu ra: Chênh lệch thời tiết giữa Ấn Độ và Canada là 27,0
Dhaval Nimavat
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.