[翻译] Swift 6 的常见编译错误
Dec 27, 2024
常见编译器错误 识别、理解并解决使用 Swift 并发时可能遇到的常见问题。 编译器提供的数据隔离保证影响所有 Swift 代码。这意味着完整的并发检查可能会暴露潜在的问题,即使是在没有直接使用任何并发语言特性的 Swift 5 代码中也是如此。在启用 Swift 6 语言模式后,这些潜在问题中的一些也可能变成错误。 …
Swift 中使用字符串 length 时的注意事项
Mar 07, 2024
在 NSString 中,有一个length 属性,在 NSMutableAttributedString 设置属性的时候, range 指定的 length 需要和 NSString 的 length 一致,否则就会出现越界错误而导致崩溃。 在 Swift 中使用的是 String 而不是 NSString ,而且 String 是全新设计的类型,虽然可以和 NSString 桥接互相使用,但是 String 的 count 属性却和 NSString 的 length 完全不同,如果在 Swift 里面操作 NSAttributedString 的时候,对于 range 的 length 设置,使用的是 count ,就会造成错误。 …
Swift 的元组(Tuple)
May 06, 2023
元组(tuple) 是 Swift 的一种数据结构,可以理解为匿名的 struct。 元组可以是参数,返回值,也可以是属性类型,合理使用元组可以使代码更简洁: extension UIColor { var rgba: (r: CGFloat, g: CGFloat, b: CGFloat, a: CGFloat) { var r: CGFloat = 0 var g: CGFloat = 0 var b: CGFloat = 0 var a: CGFloat = 0 getRed(&r, green: &g, blue: &b, alpha: &a) return (r: r, g: b, b: b, a: a) } } 为 UIColor 增加一个属性 rbga ,用于获取颜色的 RGBA 值: …
Mac 平台上常见的的包管理器的缓存位置
Oct 28, 2022
在 Mac 开发中,常用的包管理工具有三个: Cocoapods Carthage Swift Package Manager 这几个工具不仅支持本地路径,还支持远程 git 仓库连接。 随着使用时间的增加,包管理器积累的仓库代码会逐渐增多,有必要把它们的缓存位置记录下来,直接复制到其它电脑上使用,或者把缓存集中保存到一个地方,再使用符号链接重定向。 …
VSCodium 上安装 Swift 扩展
Oct 27, 2022
VSCodium 是 VSCode 的 Free/Libre 授权版本,只保留了符合 MIT license 协议的组件。 在微软的 VSCode 扩展商店中找到 Swift 扩展:https://marketplace.visualstudio.com/items?itemName=sswg.swift-lang …
Swift 在调用 super.init 之前必须初始化变量
Oct 10, 2022
先看一下踩坑的代码: public class MyView: UIView { private var count = 0 public init(count: Int) { super.init(frame: .zero) self.count = count } // 重写 setFrame 方法 override public var frame: CGRect { didSet { let w = frame.width * count } } } 以上示例中,count 属性是在 super.init(frame:) 之后才赋值, 但是由于重写了 frame 属性的 didSet 方法,而且在其中使用到了 count 属性, 这样就导致了一个隐含的 BUG:在初始化方法中触发的 frame 的 didSet 方法里使用的 count 属性的值是 0 而不是外部传进来的值。 …
Swift 5 ABI 和 Module 的稳定性
Oct 02, 2022
Swift 5.0 开始,实现了 ABI 稳定性,意味着同样的源码,即使是使用不同版本的 Swift 编译, 编译后的程序都可以在 Swift 5 Runime 下运行,而不需要要求目标环境的 Runtime 和开发环境一致。 …
Swift Package Tools Version 的写法
Sep 30, 2022
在写 Package.swift 的时候,通常第一行是使用注释的形式指定要使用的 Swift 版本: // swift-tools-version: 5.4 我把 5.4 调整为 5.0,于是改为这样: // swift-tools-version: 5.0 没想到 Xcode 报错了: Showing Recent Messages horizontal whitespace sequence [U+0020] immediately preceding the version specifier is supported by only Swift ≥ 5.4; consider removing the sequence for Swift 5.0.0 错误提示说:仅在 Swift ≥ 5.4 时候才能允许版本号之前有空格的写法,如果要保留写法需要指定 Swift 版本为 5.4 才行。 …
SwiftPM 编译命令参数
Aug 30, 2022
SwfitPM 全称是 Swift Package Manager ,是 Swift 的包管理工具。 SwiftPM 的 manifest 文件是 Package.swift,在编译源码之前需要先编译这个 manifest 文件,然后再执行它进行源码构建。 SwiftPM 的编译命令是 swift build,默认情况下是编译 debug 模式,release 模式需要增加参数:swift build -c release。 …
Swift 调用私有方法
Aug 29, 2022
_UICreateScreenUIImage 是用于生成屏幕快照的一个私有方法,效果类似按下截屏组合键,不过这个函数调用不会触发截屏音效。 在 Objective-C 里,只需要声明一下方法的原型就可以使用了。 在 Swift 里可以使用 @_silgen_name 来达到同样的效果: …