Swift 6.1 新特性

Swift 6.1 内置于 Xcode 16.3,这是 Swift 6 之后的首个小版本更新,新特性很少。

尾随逗号

元组、函数的参数、闭包捕获列表以及字符串插值等都可以像数组一样,在最后一个元素的后面添加,,以便轻松地追加、删除、重新排列或者注释最后一个元素。

swift 复制代码
// 元组
(404, "Not Found",)
// 函数的参数
func sum(num1: Int, num2: Int,) -> Int {
    num1 + num2
}
var vehicle = "Car"
// 闭包捕获列表
let closure = { [vehicle,] in
    print("Vehicle:", vehicle)
}
// 字符串插值
"This is a \(vehicle,)"

混合开发

介绍

  • 增加新的关键字@implementation,配合@objc可以为 Objective-C 导入的.h声明提供实现。
  • 实现方式:在 Swift 中扩展 Objective-C 类,然后通过@objc @implementation实现属性与方法以替换 Objective-C 的@implementation。

实现

  1. 新建一个基于 Swift 语言的 iOS 项目。
  2. 创建一个 Objective-C 类,此时会弹出一个提醒对话框(添加这个文件会创建一个 Objective-C 与 Swift 的混合项目,你是否希望 Xcode 自动配置一个桥接头文件来让 2 种语言的类文件相互可见?),点击Create Bridging Header。
  3. 项目中多出 3 个文件,分别为创建的 Objective-C 类文件(.h与.m)与 Bridging Header 文件,修改 Objective-C 类文件如下。
objc 复制代码
// .h文件
@interface Person: NSObject

@property(nonatomic, copy) NSString *name; 
-(void)eat;

@end


// .m文件
// @implementation Person
// @end
  1. 在 Bridging Header 文件中通过#import "类名.h"导入所有需要使用的 Objective-C 类的头文件。
  2. 在 Swift 中实现并且调用 Objective-C。
swift 复制代码
import UIKit

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        // 调用
        let person = Person()
        person.name = "zhangsan"
        person.eat() // zhangsan吃饭了
    }
}

// MARK: - @objc @implementation extension Objective-C类
@objc @implementation extension Person {
    // 实现属性
    var name: String?

    // 实现方法
    func eat() {
        print("\(name ?? "")吃饭了")
    }
}

注意 :一旦在 Swift 进行了实现,Objective-C 中的@implementation不需要再实现,否则会报2 duplicate symbols的编译错误。

并发编程

  • actor 允许在属性与函数上使用nonisolated,表示该 API 可以在任何并发上下文中安全调用。Swift 6.1 将nonisolated支持到了类型与扩展,这样其内的所有属性与方法不需要再单独添加nonisolated。
swift 复制代码
// 结构体
nonisolated struct Station {
}

class Train {
}
// 扩展
nonisolated extension Train {
}
  • withTaskGroup()与withThrowingTaskGroup()的闭包可以推断出子任务结果类型。
swift 复制代码
// Swift6.1之前
await withTaskGroup(of: Int.self) { group in
    ...
}
await withThrowingTaskGroup(of: String.self) { group in
    ...
}
// Swift6.1之后
await withTaskGroup { group in
    ...
}
await withThrowingTaskGroup { group in
    ...
}
相关推荐
茶底世界之下1 天前
导出进度不是一个百分比:AVFoundation 收尾阶段的状态建模
ios·swift
茶底世界之下1 天前
为什么媒体源不能在回调仍执行时提前报告 finish?
swift
茶底世界之下1 天前
为什么视频处理器必须提前声明“它能处理什么帧”
swift
茶底世界之下1 天前
录制结束,不代表视频文件已经交付:AVFoundation 录制完成状态的工程化判断
swift
茶底世界之下7 天前
为什么预览、录制、离线导出不能共享同一个背压策略?
ios·swift
2501_915909067 天前
移动端开发工具链怎么组合比较好,iOS、Android、跨端三套配置方案
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
东坡肘子7 天前
一场关于 SwiftUI 动画的“原生”之争 -- 肘子的 Swift 周报 #154
人工智能·swiftui·swift
2501_915918417 天前
iOS编程用什么软件好?主流工具Xcode、AppCode、CodeRunner与新兴快蝎对比
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
9765033358 天前
iOS 上架 4.3a 被拒【uniapp专讲】
flutter·ios·objective-c·uniapp·swift
传奇开心果编程9 天前
【SwiftUI入门练中学】第1课 从零开始
学习·ui·ios·swiftui·swift