解析 Swift 中的 @discardableResult

当写 Swift 方法时,你可能经常会遇到这样的场景:

有时候想要忽略方法的返回值,但有时候又需要处理返回值。

@discardableResult 属性可以帮我们消除因方法返回值未被使用而出现的 警告下划线

虽然它是 Swift 中的一个小功能,但最好也了解下。

何时使用

考虑是否使用 @discardableResult 属性是一件比较重要的事,因为它可以消除这一类的 警告

Result of call to ‘updateName’ is unused

如果整个项目中总是出现这类 警告 的话,也是挺讨厌的。

继续阅读“解析 Swift 中的 @discardableResult”

Swift 5.2 发布以及 5.3 规划

最近 Swift 5.2 正式发布了,该版本主要提升了开发体验:

  • 强化了 compiler diagnostics(包括错误和警告),以及 code completion
  • 强化了 debug 的可靠性。
  • 强化了 Swift Package Manager 的依赖处理。
  • 强化了 LSPSwiftSyntax 工具链。

还有一些其它方面的优化。

Language Updates

Swift 5.2 实现了如下 proposals

继续阅读“Swift 5.2 发布以及 5.3 规划”

GitHub iOS 上架 AppStore

GitHub 最近在 AppStore 上架了 官方 iOS App。即使不使用 PC,也可以处理些 GitHub 上的操作,比如组织任务、issues 反馈、评论、review 以及 merge pull requests 等。

GitHub 通知展示在收件箱中,看起来有点像邮箱的收件箱,你可以收藏或标记它们为已完成。

你也可以使用 emoji 进行评论互动,提升活跃度。

继续阅读“GitHub iOS 上架 AppStore”

Class-only Protocols – class or AnyObject

iOS 系统中广泛使用了 delegate 模式,如果有 Swift 开发经验的话,你将会发现如下代码无法正常通过编译。

class MyClass {
  weak var delegate: MyDelegate?
}

protocol MyDelegate {
}

报错信息如下:

‘weak’ must not be applied to non-class-bound ‘MyDelegate’; consider adding a protocol conformance that has a class bound

因为使用了 weak 关键字,必须让该 protocol 满足 class 类型。

protocol MyDelegate: class {

}

继续阅读“Class-only Protocols – class or AnyObject”

LeetCode题 – 两数相加

LeetCode:两数相加

题目

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

链接:https://leetcode-cn.com/problems/add-two-numbers

解决方案

继续阅读“LeetCode题 – 两数相加”

介绍 Swift ArgumentParser 库

Apple 最近新开源了一个库,叫 ArgumentParser,它是由 Swift 实现的,用于解析命令行参数(command-line arguments)的。

构建命令行工具

为了演示如何使用 ArgumentParser 库,我们将以一个生成随机数为示例。

> random 20
17
> random 100
89
> random
Error: Missing expected argument '<high-value>'
Usage: random <high-value>

定义了一个 Random 类型,并且需要一个整数类型的参数(highValue),然后会生成一个介于 1 和 highValue 之间的随机数。

源码如下:

import ArgumentParser

struct Random: ParsableCommand {
    @Argument() var highValue: Int

    func run() {
        print(Int.random(in: 1...highValue))
    }
}

Random.main()

实现就是这么简单。

  • @Argument 表明该属性是作为命令行参数(command-line argument)的。
  • 调用 main() 方法,将会开始解析,如果成功将运行命令行工具(command-line tool)。
  • 该库也会提供一些引导性的信息给用户,比如 highValue 属性的名称以及类型等。
  • highValue 被定义成 Int 类型,只有输入合法的值才可以,否则将会报错。

继续阅读“介绍 Swift ArgumentParser 库”

介绍 Standard Library Preview Package

Apple 最近新开源了一个项目,命名为 Standard Library Preview Package,主要是用来加强 Swift Evolution 进程的。该 Preview Package 将包含已被纳入 Swift Standard Library 计划但还没被集成到 Swift 正式版中的功能。这可以使得我们在真实环境中使用这些新特性,并给予及时的反馈,同时也降低了给 Standard Library 贡献代码的技术门槛。

Preview Package 最近接收了 SE-0270 提议,该提议实现了获取一个集合的子集,比如 subranges(where:)moveSubranges(_:to:)

使用 Preview Package

想在 Swift Package Manager 项目中使用 Standard Library Preview Package,只需要编辑 Package.swift 文件即可。

let package = Package(
    name: "MyPackage",
    dependencies: [
       .package(url: "https://github.com/apple/swift-standard-library-preview.git", from: "0.0.1"),
    ],
    targets: [
        .target(
            name: "MyTarget",
            dependencies: [.product(name: "StandardLibraryPreview", package: "swift-standard-library-preview")]),
    ]
)

继续阅读“介绍 Standard Library Preview Package”

介绍 Swift Crypto 库

最近 Apple 官方推出了一个新的 SwiftSwift Crypto 。该库将 Apple 平台的 CryptoKit 库拓展到了其它平台(比如:Linux),这样其它平台上也将可以使用加密相关的 API 了。

使用方法很简单,只需要导入对应库即可:

import Crypto

示例代码

func encrypt(input: [UInt8]) throws -> Data {
    // Don't forget to save your key somewhere!
    let key = SymmetricKey(size: .bits256)
    let sealedBox = try AES.GCM.seal(input, using: key)
    return sealedBox.combined!
}

跨平台

Apple 平台上,Swift Crypto 直接使用已有的 CryptoKit 库,但其它平台上将基于 BoringSSL 库重新实现,最终将在所有平台上提供一套统一且方便使用的 API

继续阅读“介绍 Swift Crypto 库”

Swift 2019 这一年

Swift 2019 回顾

  • Swift 5 & 5.1 发布
  • Swift ABI 稳定
  • SwiftUI 发布
  • Xcode 集成 Swift Package Manager
  • SwiftNIO 2 发布
  • SwiftLog 发布
  • SwiftMetrics 发布
  • StatsdClient 发布
  • swift-numerics 发布
  • Vapor 4 Beta 发布

Swift 2020 展望

  • Swift 5.2
  • Vapor 4 正式版

继续阅读“Swift 2019 这一年”

Swift 文档编写规范

本篇为译文,原文可见:链接

如果超过 6 个月没看过自己写的代码的话,你可能会认为这些代码是其他人写的。

-Eagleson’s Law

当我们使用 Appleclass 时,如果不知道如何使用它们的话,我们有很多方式可以去查找资料。比如你可以通过 Apple Developer Documentation 在线文档或者通过 Xcode 来查找。

Quick help popover

你可以通过 ⌥ – Option + click 方式查看任何 class

Symbol inspector Quick Help

Quick help 也显示在 Quick Help 检查面板(inspector panel)上。

Code completion hint

当你开始打字时,Xcode 将会有相应的提示信息(包含 class 中的 function/property/enum

接下来将介绍如何给自己的代码加上这些提示。

Syntax

给代码写文档就像写注释一样,但是有一点点语法上的差别。你需要 /// 来标注单行的文档。

/// This is your User documentation.
struct User {
    let firstName: String
    let lastName: String
}

对于多行文档,你需要 /** ... */ 符号。

/**
    This is your User documentation.
    A very long one.
*/
struct User {
    let firstName: String
    let lastName: String
}

继续阅读“Swift 文档编写规范”