现在感觉 Swift 真的被 OC 拖后腿了

2023-04-07 14:52:17 +08:00
 chiaf

最近接手了公司一个项目,看了几天,发现一个用 Swift 开发的项目,但是所有的数组,字典类型用的全是 OC 中的类型,NSArrayNSMutableArrayNSDictionaryNSMutableDictionary

每次看到从这些类型中取值、设置值都很头疼(好几年没写 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 踢出去呀

2361 次点击
所在节点    Swift
11 条回复
paradoxs
2023-04-07 14:53:52 +08:00
公司还让你们用 swift 啊,, 现在不都是一套代码,所有平台一起编译吗
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 的版本。但还有得改呢
chiaf
2023-04-07 16:07:18 +08:00
@pocarisweat 😩,烦哦,之前写都没有这个感觉,因为全部都是 Swift ,也就用下 OC 的库。但是这次真的,真的看着累,写着更累
timedivision
2023-04-07 22:47:11 +08:00
借楼问一下,TabView onChange 没法触发 matchedGeometryEffect 的动画吗?
hstdt
2023-04-09 19:24:07 +08:00
这个和 oc 有啥关系,不过是用 swift 用的太烂了
chiaf
2023-04-09 21:14:06 +08:00
@hstdt 我问他为什么要用 OC 的类,他说这有什么问题吗🙃
chipmuck
2023-04-22 02:18:16 +08:00
在 Swift 中使用 NS- 的集合对象我觉得完全没有问题,这些集合对象都是 value type ,如果想要使用 reference type ,就要使用 Foundation 中的集合(在 https://developer.apple.com/videos/play/wwdc2018/229/ 也提到了两种不同结构集合的用法)。
chiaf
2023-04-22 20:45:12 +08:00
@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 就会崩溃。
sl0000
2023-04-23 20:10:52 +08:00
OC 永远都不会被扔掉的。
HeMinWon
110 天前
新功能尽量使用 Swift 的语言特性,与已有项目做好代码隔离
worldhandsomeboy
65 天前
为了纯 swift 开发一个项目,OC 方面的能不用就不用,如 NS-这些。一些常用的功能使用 swift 手撸凑合用,就是为了方便对 swift 的了解。他这个是对 swift 了解的还不多造成的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/930584

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX