Swift从头开始:功能简介

要在Swift中完成所有工作,您需要了解函数的来龙去脉。 在Swift中,功能异常强大且灵活。 基础很简单,尤其是如果您以前使用过其他编程语言。 但是由于Swift的灵活语法,如果您不熟悉基础知识,函数可能会造成混乱。

在本文中,我们首先关注基础知识。 然后,在下一篇文章中,我们将继续探索更复杂的语法和用例。 重要的是,不要略过基础知识,因为基础知识对于了解功能的功能来源至关重要。 让我们首先通过示例剖析Swift中的函数剖析。

1.以身作则

函数不过是可以在需要时执行的代码块。 让我们看一下Swift函数的基本结构示例。 启动Xcode并创建一个新的游乐场。 将以下函数定义添加到游乐场。

func printHelloWorld() {
    print("Hello World!")
}

函数以func关键字开头,后跟函数名称,在我们的示例中为printHelloWorld 。 与许多其他语言一样,函数的名称后面是一对括号,其中包含函数的参数,即函数的输入。

函数的主体包裹在一对花括号中。 printHelloWorld()函数包含一个打印字符串Hello World!语句Hello World! 到标准输出。 这就是Swift中的基本功能。 语法简单,简洁且极简。

您可以通过键入函数名称,后接一对括号来调用该函数。

printHelloWorld()

2.参数

通过向函数定义中添加参数,使上面的示例更加复杂。 这仅表示我们为函数提供了可以在函数主体中使用的输入值。 在下面的示例中,我们定义了printMessage(message:)函数,该函数接受String类型的一个参数message

func printMessage(message: String) {
    print(message)
}

一个函数可以接受多个参数或输入值。 参数由函数名称后的括号引起来。 参数的名称后跟冒号和参数的类型。 您还记得,这与声明变量或常量非常相似。 它只是说message参数的类型为 String

而不是像在printHelloWorld()函数中那样打印硬编码的字符串,而是打印message参数的值。 这使功能灵活且更有用。

调用该功能与我们之前看到的非常相似。 唯一的区别是调用函数时我们传入了一个参数。

printMessage(message: "Hello World!")

请注意,术语参数参数通常可以互换使用,但是Swift中存在细微的语义差异。 在Swift中,参数是在函数定义中指定的值,而参数是在调用函数时传递给函数的值。

多个参数

正如我之前提到的,函数的语法非常灵活,并且可以将多个参数传递给函数完全没有让您感到惊讶。 在下一个示例中,我们在printMessage(message:times:)函数上创建一个变体,使我们可以多次打印消息。

func printMessage(message: String, times: Int) {
    for i in 0..<times {
        print("\(i) \(message)")
    }
}

虽然该函数的名称与原始printMessage(message:)函数的名称相同,但是该函数的类型不同。

理解上一句话很重要。 再读一遍。

每个函数都有一个类型,由参数类型和返回类型组成。 我们将在稍后探讨返回类型。 函数的名称可以相同,只要它们的类型不同即可,如前两个函数定义所示。

第一个函数的类型是(String) -> () ,而第二个函数的类型是(String, Int) -> () 。 这两个函数的名称相同。 不用担心->符号。 当我们讨论返回类型时,其含义将在几分钟后变得清晰。

第二个printMessage(message:times:)函数定义两个参数, String类型的messageInt类型的times 。 该定义说明了Swift从Objective-C所采用的功能之一,可读函数和方法名。 该函数的名称为printMessage ,但通过读取该函数的参数名称可以很容易理解该函数的功能。

在第二个printMessage(message:times:)函数中,我们创建一个for - in循环来打印message字符串times次。 如本系列前面所述,我们使用半开范围运算符..<

调用功能

当我们开始在操场上键入printMessage时,Xcode在自动完成菜单中显示这两个功能。 由于函数的类型,可以轻松选择我们感兴趣的函数。调用第二个printMessage(message:times:)函数非常简单:

printMessage(message: "Hello World", times: 3)

默认值

我最喜欢的功能之一是能够定义参数的默认值。 如果您使用的语言具有很长的历史,这听起来可能很愚蠢,但是如果您使用C和Objective-C已有多年的经验,那就太好了。

简而言之,Swift允许开发人员为函数的参数定义默认值。 让我们定义一个新函数,以特定格式打印当前日期。 确保在操场的顶部添加以下导入语句以导入UIKit框架。

import UIKit

让我们首先定义printDate(date:format:)函数,而不使用任何参数的默认值。

func printDate(date: Date, format: String) {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = format
    print(dateFormatter.string(from: date))
}

如果您不熟悉Foundation框架,并且不了解函数体中正在发生的事情,那很好。 此示例的重点不是格式化日期的实现。 在printDate(date:format:) ,我们使用format参数的值来格式化date的值。 如果我们不传递format参数的值,则编译器将引发错误。

缺少函数参数

我们可以通过为函数的第二个参数定义默认值来对此进行补救,如下面更新的函数定义所示。

func printDate(date: Date, format: String = "YY/MM/dd") {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = format
    print(dateFormatter.string(from: date))
}

定义默认值就像在函数定义的参数列表中指定一个值一样简单。 结果是编译器不再抱怨,错误消失了。

printDate(date: Date())

即使我们为format参数指定了默认值,我们仍然可以根据需要传递一个值。

printDate(date: Date(), format: "dd/MM/YY")

请注意,Apple建议在参数列表的末尾使用默认值来定位参数。 这当然是一个好主意,并且在支持可选参数的大多数其他编程语言中很常见。

3.返回类型

到目前为止,我们看到的函数在调用它们时不会返回任何信息。 让我们通过将格式化的日期作为字符串返回,而不是在函数的主体中打印格式化的日期,使printDate(date:format:)函数更有用。 这需要进行两项更改,如下所示。

func printDate(date: Date, format: String = "YY/MM/dd") -> String {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = format
    return dateFormatter.string(from: date)
}

我们更改的第一件事是函数的定义。 在参数列表之后,我们指定返回类型String 。 返回类型前面带有->符号。 如果您使用过CoffeeScript,那么这看起来会很熟悉。

代替使用print(_:separator:terminator:)函数print(_:separator:terminator:)格式化的日期,我们使用return关键字从该函数返回值。 这就是我们需要做的。 让我们尝试一下。

let formattedDate = printDate(date: Date(), format: "dd/MM/YY")

print(formattedDate)

我们调用printDate(date:format:)函数,将返回的值存储在常量formattedDate ,并在标准输出中打印formattedDate的值。 请注意, printDate(date:format:)函数的名称不再反映其功能,因此您可能需要将其更改为formatDate

没有退货类型

我们在本教程中定义的其他函数没有返回类型。 当函数没有返回类型时,就不必在函数定义中包含->符号。

在前面的几段中,我告诉您,我们定义的函数都没有向我们返回任何值。 实际上,这并非完全正确。 让我通过一个实验来解释细节。 将以下行添加到您的游乐场,看看会发生什么。

编译器显示警告

这是有趣的。 Swift并没有问题,我们将printHelloWorld()函数的返回值存储在一个常量中,但是它确实警告我们,返回值的类型不是我们可能认为的那样。

这里发生了什么事? 即使我们未在函数定义中定义返回类型,Swift中的每个函数也会返回一个值。 当函数未明确指定返回类型时,该函数隐式返回Void ,它等效于一个空元组或() 。 您可以在操场的输出窗格中看到此内容,并且在编译器输出警告中也提到了这一点。

我们可以通过显式声明value的类型(一个空的元组)来摆脱上述警告。 我同意将一个空的元组存储在一个常量中并不是很有用,但是它向您说明了每个函数都有一个返回值。

let value: () = printHelloWorld()

元组

Swift的另一个强大功能是能够通过返回一个元组从一个函数返回多个值。 以下示例说明了它是如何工作的。 让我重复一遍,了解timeComponentsForDate(date:)函数是如何工作的并不重要。 焦点是函数的返回值,即具有三个元素的元组。

func timeComponentsForDate(_ date: Date) -> (hour: Int, minute: Int, second: Int) {
    let dateComponents = Calendar.current.dateComponents([.hour, .minute, .second], from: date)
    let hour = dateComponents.hour
    let minute = dateComponents.minute
    let second = dateComponents.second
    return (hour ?? 0, minute ?? 0, second ?? 0)
}

该函数接受一个参数,一个Date实例,并返回带有三个标记值的元组。 标记元组的值只是为了方便; 可以省略标签。

func timeComponentsForDate(_ date: Date) -> (Int, Int, Int) {
    let dateComponents = Calendar.current.dateComponents([.hour, .minute, .second], from: date)
    let hour = dateComponents.hour
    let minute = dateComponents.minute
    let second = dateComponents.second
    return (hour ?? 0, minute ?? 0, second ?? 0)
}

但是,如下面的示例所示,标记从函数返回的元组的值非常方便,并使您的代码更易于理解。

let timeComponents = timeComponentsForDate(Date())

print(timeComponents.hour)
print(timeComponents.minute)
print(timeComponents.second)

如果在某些情况下该函数没有要返回的值,则还可以从该函数返回一个可选值。 就像将函数的返回类型定义为可选操作一样简单,如下所示。

func timeComponentsForDate(_ date: Date) -> (hour: Int, minute: Int, second: Int)? {
    let dateComponents = Calendar.current.dateComponents([.hour, .minute, .second], from: date)

    guard let hour = dateComponents.hour else {
        return nil
    }

    guard let minute = dateComponents.minute else {
        return nil
    }

    guard let second = dateComponents.second else {
        return nil
    }

    return (hour, minute, second)
}

结论

在本教程中,我们探讨了Swift中的函数基础。 理解函数的语法很重要,因为在下一篇文章中,我们将探索基于本教程内容的更高级的函数。

我鼓励您在必要时再次阅读本文,更重要的是,在操场上编写一些函数以熟悉语法。 基础知识很容易理解,但是您只能通过实践来掌握它们。

如果您想学习如何使用Swift 3编写现实应用程序代码,请查看我们的课程“ 使用Swift 3创建iOS应用程序” 。 无论您是iOS应用程序开发的新手还是想从Objective-C转向,此课程都将使您开始使用Swift进行应用程序开发。

翻译自: https://code.tutsplus.com/tutorials/swift-from-scratch-an-introduction-to-functions--cms-22879

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值