V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
chiaf
V2EX  ›  Swift

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

  •  
  •   chiaf · 2023-04-07 14:52:17 +08:00 · 2996 次点击
    这是一个创建于 619 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近接手了公司一个项目,看了几天,发现一个用 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 踢出去呀

    11 条回复    2024-02-24 09:51:20 +08:00
    paradoxs
        1
    paradoxs  
       2023-04-07 14:53:52 +08:00
    公司还让你们用 swift 啊,, 现在不都是一套代码,所有平台一起编译吗
    pocarisweat
        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 的版本。但还有得改呢
    chiaf
        3
    chiaf  
    OP
       2023-04-07 16:07:18 +08:00
    @pocarisweat 😩,烦哦,之前写都没有这个感觉,因为全部都是 Swift ,也就用下 OC 的库。但是这次真的,真的看着累,写着更累
    timedivision
        4
    timedivision  
       2023-04-07 22:47:11 +08:00
    借楼问一下,TabView onChange 没法触发 matchedGeometryEffect 的动画吗?
    hstdt
        5
    hstdt  
       2023-04-09 19:24:07 +08:00 via iPhone
    这个和 oc 有啥关系,不过是用 swift 用的太烂了
    chiaf
        6
    chiaf  
    OP
       2023-04-09 21:14:06 +08:00
    @hstdt 我问他为什么要用 OC 的类,他说这有什么问题吗🙃
    chipmuck
        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/ 也提到了两种不同结构集合的用法)。
    chiaf
        8
    chiaf  
    OP
       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
        9
    sl0000  
       2023-04-23 20:10:52 +08:00
    OC 永远都不会被扔掉的。
    HeMinWon
        10
    HeMinWon  
       341 天前
    新功能尽量使用 Swift 的语言特性,与已有项目做好代码隔离
    worldhandsomeboy
        11
    worldhandsomeboy  
       297 天前
    为了纯 swift 开发一个项目,OC 方面的能不用就不用,如 NS-这些。一些常用的功能使用 swift 手撸凑合用,就是为了方便对 swift 的了解。他这个是对 swift 了解的还不多造成的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5560 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 02:03 · PVG 10:03 · LAX 18:03 · JFK 21:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.