Swift 5.5 内置于 Xcode 13,尽管版本号只减少了 0.1,看似是一个小版本升级,但却带来了十分多的新内容,其中最大的更新是引入了全新的并发编程形式。
本文收录:http://www.cocoachina.com/art...
条件编译反对表达式
SwiftUI 在跨平台时会应用到条件 Modifier,之前的解决方案是本人写一套判断体系, Swift 5.5 当前,原生反对条件编译表达式,跨平台更加不便。
struct ContentView: View { var body: some View { Text("SwiftUI") #if os(iOS) .foregroundColor(.blue) #elseif os(macOS) .foregroundColor(.green) #else .foregroundColor(.pink) #endif }}
CGFloat与Double反对隐式转换
let number1: CGFloat = 12.34let number2: Double = 56.78let result = number1 + number2 // result为Double类型复制代码
上面的代码在 Swift 5.5 之前会报错,因为scale
为 Double 类型,而 SwiftUI 中须要绑定 CGFloat 类型。
struct ContentView: View { @State private var scale = 1.0 // Double类型 var body: some View { VStack { Image(systemName: "heart") .scaleEffect(scale) // 隐式转换为CGFloat Slider(value: $scale, in: 0 ... 1) } }}
泛型上下文中反对动态成员查找(static member lookup)
这个新个性使得 SwiftUI 中的局部语法更加简洁好用。
struct ContentView: View { @Binding var name: String var body: some View { HStack { Text(name) TextField("", text: $name) // .textFieldStyle(RoundedBorderTextFieldStyle()) // 以前写法 .textFieldStyle(.roundedBorder) // 新写法,更简洁 } }}
局部变量反对lazy
func lazyInLocalContext() { print("lazy之前") lazy var swift = "Hello Swift 5.5" print("lazy之后") print(swift)}// 调用lazyInLocalContext()/* 输入lazy之前lazy之后Hello Swift 5.5*/
函数和闭包参数反对属性包装
- Swift 5.1 中引入了属性包装。
- Swift 5.4 将属性包装反对到局部变量。
- Swift 5.5 将属性包装反对到函数和闭包参数。
@propertyWrapper struct Trimmed { private var value: String = "" var wrappedValue: String { get { value } set { value = newValue.trimmingCharacters(in: .whitespacesAndNewlines) } } init(wrappedValue initialValue: String) { wrappedValue = initialValue }}struct Post { func trimed(@Trimmed content: String) { // 函数参数反对PropertyWrapper print(content) }}let post = Post()post.trimed(content: " Swift 5.5 Property Wrappers ")
带有关联值的枚举反对Codable
有了该性能之后,枚举就能够像构造体、类一样用来作为数据模型了。
- 枚举到 JSON。
// 定义带有关联值的枚举enum Score: Codable { case number(score: Double) case letter(score: String)}// 创建对象let scores: [Score] = [.number(score: 98.5), .letter(score: "优")]// 转JSONlet encoder = JSONEncoder()encoder.outputFormatting = .prettyPrinteddo { let result = try encoder.encode(scores) let json = String(decoding: result, as: UTF8.self) print(json)} catch { print(error.localizedDescription)}
- JSON 到枚举。
enum Score: Codable { case number(score: Double) case letter(score: String)}// JSONlet json = """[ { "number" : { "score" : 98.5 } }, { "letter" : { "score" : "优" } }]"""// 转枚举let decoder = JSONDecoder()do { let scores = try decoder.decode([Score].self, from: json.data(using: .utf8)!) for score in scores { switch score { case let .number(value): print(value) case let .letter(value): print(value) } }} catch { print(error.localizedDescription)}
文末举荐:iOS热门文集&视频解析
① Swift
② iOS底层技术
③ iOS逆向防护
④ iOS面试合集
⑤ 大厂面试题+底层技术+逆向安防+Swift
喜爱的小伙伴记得点赞喔~
珍藏等于白嫖,点赞才是真情( ´・・` )