为什么Swift中dropLast可直接返回数组,dropFirst却不行?
问题原因
这个差异是Xcode 12.5.1对应的Swift 5.4版本标准库的实现不一致导致的:
- 针对无参数调用的场景,Swift 5.4标准库为
Array的dropLast()额外提供了一个直接返回[Element]类型的重载,所以你无需手动转换类型就可以直接返回给声明为[Any]的返回值。 - 但同版本标准库没有给无参数的
dropFirst()提供对应的返回Array的重载,默认实现返回的是ArraySlice<Any>,无法隐式转换为[Any],所以编译报错。
你可以做个简单验证:把第一个可以编译的函数修改为调用带参数的dropLast(1),也会触发同样的类型不匹配错误,因为带参数的dropLast没有对应的返回数组的重载。
修复方案
手动将ArraySlice转换为数组即可:
func dropFirstFromArray(_ array: [Any]) -> [Any] { return Array(array.dropFirst()) }
这个不一致的问题在Swift 5.5(对应Xcode 13及更高版本)中已经被修复,两个无参数方法的重载逻辑已经对齐。
内容的提问来源于stack exchange,提问作者Malachi Holden
相关产品推荐
相关产品推荐

