最近接手了公司一个项目,看了几天,发现一个用 Swift 开发的项目,但是所有的数组,字典类型用的全是 OC 中的类型,NSArray
,NSMutableArray
,NSDictionary
,NSMutableDictionary
。
每次看到从这些类型中取值、设置值都很头疼(好几年没写 OC 了):
var dict = NSMutableDictionary()
dict = NSMutableDictionary(dictionary: te as! NSDictionary)
dict.setValue("\((index as! NSDictionary).object(forKey: "foo")!)", forKey: "foo")
完全不使用 Swift
的语言特性,一些高级函数都无法使用,关键这是一个 Swift 项目。
虽然其中有一些是从 16 年就有的代码,但是最近开发的功能还这么做,就很无语。
就像是用 TypeScript
进行项目开发,但是所有的类型都是 Any
诶,什么时候 Swift
能把 OC 踢出去呀
1
paradoxs 2023-04-07 14:53:52 +08:00
公司还让你们用 swift 啊,, 现在不都是一套代码,所有平台一起编译吗
|
2
pocarisweat 2023-04-07 15:59:26 +08:00
只要 OC 及苹果底层用 OC 写的那堆东西还在,OC 就不会被淘汰的,那 Swift 和 OC 互操作就是刚需。
况且 OC 的理念其实也不落后,只是和 Swift 语言上确实格格不入,Swift 是更接近 Rust/C++这类风格的语言。苹果这几年的新 API 都是 Swift Only 的( SwiftUI 、Combine 、CryptoKit 、TextKit2 ),明显是要给以前 NS 开头的 OC API 慢慢加上 Swift 的版本。但还有得改呢 |
3
chiaf OP @pocarisweat 😩,烦哦,之前写都没有这个感觉,因为全部都是 Swift ,也就用下 OC 的库。但是这次真的,真的看着累,写着更累
|
4
timedivision 2023-04-07 22:47:11 +08:00
借楼问一下,TabView onChange 没法触发 matchedGeometryEffect 的动画吗?
|
5
hstdt 2023-04-09 19:24:07 +08:00 via iPhone
这个和 oc 有啥关系,不过是用 swift 用的太烂了
|
7
chipmuck 2023-04-22 02:18:16 +08:00
在 Swift 中使用 NS- 的集合对象我觉得完全没有问题,这些集合对象都是 value type ,如果想要使用 reference type ,就要使用 Foundation 中的集合(在 https://developer.apple.com/videos/play/wwdc2018/229/ 也提到了两种不同结构集合的用法)。
|
8
chiaf OP @chipmuck 有问题的,swift 主打的是静态类型安全,使用 NS 的集合,遍历的时候,元素类型全是 Any ,需要使用的时候就得做强制解包,而 app 崩溃最多的原因就是强制解包失败引起的崩溃。
比如:let arr: NSArray = [1,2,3,4] 然后使用 filter 进行筛选大于 2 的元素 arr.filter { el in el > 2 } 这个时候是有错误提示的,Cannot convert value of type 'NSArray.Element' (aka 'Any') to expected argument type 'Int' 必须这样写才可以 arr.filter { el in el as! Int > 3 } 这还是简单的,我在公司的项目里面看到的比这恶心多了。 比如这样的: var dict = NSMutableDictionary() dict = NSMutableDictionary(dictionary: te as! NSDictionary) dict.setValue("l((te as! NSDictionary) . object(forKey: "max_ limit")!)", forKey: "to_ _max_ limit" ) te 是个 NSArray 中的一个元素 如果 API 返回了一个错误的类型,app 就会崩溃。 |
9
sl0000 2023-04-23 20:10:52 +08:00
OC 永远都不会被扔掉的。
|
10
HeMinWon 355 天前
新功能尽量使用 Swift 的语言特性,与已有项目做好代码隔离
|
11
worldhandsomeboy 310 天前
为了纯 swift 开发一个项目,OC 方面的能不用就不用,如 NS-这些。一些常用的功能使用 swift 手撸凑合用,就是为了方便对 swift 的了解。他这个是对 swift 了解的还不多造成的。
|