发布于 2026-01-06 2 阅读
0

面向 Web 开发人员的 Swift

面向 Web 开发人员的 Swift

Swift 已成为 iOS 开发的标准语言,并且也逐渐成为服务器端编程的热门语言。我之前的编程经验主要集中在 PHP 和 JavaScript 上,所以 Swift 对我来说是一个全新的世界。我写这篇文章的目的是帮助那些来自 PHP、Python 或 Ruby 的 Web 开发者快速上手 Swift。

安装

macOS

在 Mac 上安装 Swift 非常简单。只需安装Xcode即可!它有一个很棒的 Playground 功能,可以用来试用这门语言。

Linux

要在 Linux 上使用 Swift,只需按照Swift.org上的说明下载并运行编译器即可。或者,也可以使用Docker镜像来运行 Swift。

视窗

如果你使用的是 Windows 10,你可以在 Linux 子系统中安装 Swift,但最简单的方法是安装上面提到的 Docker 镜像。

我的分号在哪里?

print("Hello, world!")
Enter fullscreen mode Exit fullscreen mode

首先你会注意到,Swift 不像 Ruby 或 Python 那样要求每行末尾都必须有分号。Swift 的设计兼顾了脚本语言和编译语言的特性,因此你会发现它融合了这两种语言的不同风格。

此外,与 Ruby 和 Python 类似,在条件语句中不需要使用圆括号,但需要像 Java 和 PHP 一样使用方括号将代码块的内容括起来。

if true {
    print("It is true")
}
Enter fullscreen mode Exit fullscreen mode

Swift 对循环使用了相同的结构。

let fruits = ["Apple", "Pear", "Orange"]
for fruit in fruits {
    print("My favorite fruit is: \(fruit)")
}
Enter fullscreen mode Exit fullscreen mode

let 与 var

在 Swift 中,数据名称可以使用两个不同的关键字声明:`constant`let和 `variable` var。与 ES6 JavaScript 不同,let`constant` 用于常量,` varvariable` 用于常规变量。常量的值let一旦设置就不能更改,而常规变量var可以根据需要进行修改。

如果你编写以下代码,将会收到错误提示:

let name = "Andrew"
name = "not Andrew"
Enter fullscreen mode Exit fullscreen mode

但是,以下情况是可以接受的:

var count = 1
count = 2
Enter fullscreen mode Exit fullscreen mode

如果你创建了一个变量,然后从未更改过它,Swift 编译器会给你一个警告,因此最佳实践是从常量开始,只有在需要将其转换为其他类型时才将其更改为变量。

Swift Loves Types

Swift 中所有东西都是静态类型的,但类型推断方式与 Go 或 Rust 类似。类型推断的基本含义是编译器会根据变量的初始值来推断其类型。因此,如果您尝试创建一个未定义类型的常量或变量,则必须立即为其赋值,以便编译器知道它的类型。

例如,如果您运行这段代码,将会得到一个错误。

let favoriteMovie
favoriteMovie = "Return of the Jedi"
Enter fullscreen mode Exit fullscreen mode

你必须要么声明常量类型,要么立即设置常量。

let favoriteMovie: String
favoriteMovie = "Return of the Jedi"

let secondFavoriteMovie = "The Empire Strikes Back"
Enter fullscreen mode Exit fullscreen mode

Swift 为所有标准数据片段提供了类型,Int String Float Double Bool而且还有更多。

参数名称!

Swift 最让我喜欢的特性之一就是参数命名。当你创建一个函数并为参数命名时,调用该函数的代码也必须为参数命名。

func sayHello(greeting: String) {
    print(greeting)
}

sayHello(greeting: "Hola!")
Enter fullscreen mode Exit fullscreen mode

一旦你习惯了,它会让你的函数更具表现力。如果你不想使用命名参数,可以_在参数名称前加一个反斜杠来省略它。

func sayGoodbye(_ goodbye: String) {
    print(goodbye)
}

sayGoodbye("Adios!")
Enter fullscreen mode Exit fullscreen mode

在 Swift 标准库中,你会看到根据情况以两种方式编写的函数,因此它是编写你自己的函数的一个很好的参考。

这些问号是什么意思?

如果你之前读过一些 Swift 代码,你可能已经注意到很多地方使用了问号。问号用于创建特殊类型,它基本上表示该值可以是类型或 nil。例如,如果一个变量声明为 `("a", "b", "c", "nil")` var optional: String?,则表示该值optional可以是 `a`或String`nil` nil

现在,获取可选类型的值需要一些额外的步骤。要使用可选类型的变量,必须先解包其值。

let optional: String? = "I am an optional"
if let value = optional {
    print(value)
}
Enter fullscreen mode Exit fullscreen mode

通过使用 if 语句,您可以验证可选值是否为空nil,如果是,则将其设置为可在代码块value中使用if

你也可以使用 guard 语句来解包可选值。

enum OptionalError: Error {
    case optionalIsNil
}

let value: String? = nil
guard let name = value else {
    throw OptionalError.optionalIsNil
}
Enter fullscreen mode Exit fullscreen mode

一条守卫语句尝试将值解包为name常量,但如果它返回 `None` nil,则会执行代码块的内容。在本例中,由于 ` valueNone` 为`None` nil,守卫代码块会抛出一个客户错误,表明出现了问题。

第一次使用可选类型可能会让人感到困惑,你可能会问:那为什么要使用可选类型呢?可选类型的目的是确保你的代码能够处理所有常量和变量可能为空的情况nil。例如,假设你有一个函数,用于从会话中获取当前用户,那么你就需要处理会话为空的情况。

func getCurrentUser(session: Session) -> User? {
    if session.has("currentUser") {
        return session.get("currentUser")
    }

    return nil
}

let session = Session()
if let user = getCurrentUser(session: session) {
    print(user.name)
}
Enter fullscreen mode Exit fullscreen mode

在这种情况下,getCurrentUser函数可能会返回 `User` 对象nil,所以我们只在函数返回的值确实是 `User` 对象时才打印用户名。如果我们不进行检查nil,就会出现运行时错误,因为不存在 `User` 对象。归根结底,可选值的目的是为了让你的代码更规范。

结构体与类

当你开始用 Swift 编写代码时,你会注意到有两种结构看起来几乎相同。以下是一个示例:

struct CarSize {
    var height: Double
    var width: Double
    var length: Double

    init(height: Double, width: Double, length: Double) {
        self.height = height
        self.width = width
        self.length = length
    }

    func getArea() -> Double {
        return width * length
    }
}

class Car {
    var make: String
    var model: String
    var color: String

    init(make: String, model: String, color: String) {
        self.make = make
        self.model = model
        self.color = color
    }

    func getType() -> String {
        return "\(make): \(model)"
    }
}

let carSize = CarSize(height: 10, width: 10, length: 20)
let car = Car(make: "Chevrolet", model: "Corvette", color: "Red")
Enter fullscreen mode Exit fullscreen mode

结构体和类都用于创建可以包含属性和方法的自定义类型。那么它们之间有什么区别呢?

首先,只有类才能继承其他类。结构体不能继承结构体。如果需要任何类型的继承,则必须使用类。

其次,类的实例是按引用传递的,而结构体的实例是按值传递的。简而言之,这意味着它们在内存中的存储方式不同。当你创建一个类的实例时,保存该实例的变量实际上并不存储实例本身,而是存储一个内存 ID,即指向实例在内存中位置的引用。而保存结构体实例的变量则实际存储的是结构体本身,而不仅仅是一个引用。因此,当你将一个类实例传递给一个函数时,函数接收到的是一个对象的引用;而当你将一个结构体实例传递给一个函数时,函数接收到的则是该结构体的副本。这两种方式各有优缺点,因此选择结构体还是类取决于你的具体需求。

最终,结构体通常用于封装简单的数据值,例如CarSize示例中的数据;而类则用于处理其他所有可能包含频繁变化类型或具有修改方法的数据。苹果建议在大多数情况下使用类。

结论

希望这篇简要介绍能帮助你更快地理解一些 Swift 概念。我推荐阅读苹果公司的《Swift 程序设计语言》一书以了解更多信息。如有任何疑问,请留言。

祝你Swifting愉快!

文章来源:https://dev.to/restoreddev/swift-for-web-developers-2hh