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

学习 ios ( Swift ) 开发一个多礼拜的心得:入门到放弃

  •  
  •   xiangyuecn ·
    xiangyuecn · 2019-07-31 09:41:08 +08:00 · 16625 次点击
    这是一个创建于 1944 天前的主题,其中的信息可能已经有所发展或是发生改变。

    学了一个多礼拜,看了 2 本书,毛都没写出来😂

    主要是新入门,基础的功能都要从 0 开始写,够折腾的。不过还好蛮多 java 代码改改就能移植到 swift 里面。

    遇到的几个问题吐槽一下:

    1. 粗略看了两本 swift ios app 的书,里面的内容感觉:原来写成这样的层次也可以出书(捂脸 。看完了官方的The Swift Programming Language LANGUAGE GUIDE,稍微浅显易懂了点,算有点价值吧

    2. 没有抽象类这个玩意,不知道怎么写子类必须实现某些方法,现在用一个父类加一个 protocol 接口组合起来当做抽象类,写着别扭。

    3. 遇到问题搜 10 篇文章,有 6 篇是抄的还不带格式,另外 3 篇在讲故事,剩 1 篇终于把问题解决了。

    4. 至今没找到怎么把任意对象转成字符串,比如:obj:AnyObject, 好希望有:obj.toString(),现在用的"\(obj)"有点丑。

    5. 一个方法注释里面明明说会引发异常,但方法并没有用 throws 把异常抛出来也没有其他措施,强制用 try 捕获会显示黄色警告,折磨死人。参考:FileHandle.write 往文件写数据这个方法,没任何返回值也没有抛任何异常,但注释说会引发异常,怕怕。也许是使用姿势不对😂

    6. xcode 项目那个文件虽然是文本,但几乎不是人工能编写的(有点反人类)。同样是新入门,Android Studio 的项目管理就没有这么难产。

    慢慢积累吧,还好 swift 语法还算正常不用去写 oc ( oc 看起来像写甲骨文,学不动)。入门到放弃!但真放弃却是不可能的,慢慢磨吧。有大佬指点迷津就更好了😊

    116 条回复    2019-08-01 23:32:07 +08:00
    1  2  
    manwei6341
        1
    manwei6341  
       2019-07-31 10:01:08 +08:00
    玩不起,就别玩了。。其实现在好很多了。from version 1.2 to 5.0 的路过。
    CoCoMcRee
        2
    CoCoMcRee  
       2019-07-31 10:05:24 +08:00
    很好奇, 为啥想要入 iOS 开发这个坑呢
    iOS 开发现在工作都找不到呢
    Lin0936
        3
    Lin0936  
       2019-07-31 10:07:50 +08:00
    Swift 还行吧,也是上月底开始学的,之前一直开发 Android App,一个月撸了个 iOS 版,昨天弄去审核了。
    swift 有些写法还挺舒服,但是大多数还是感觉别扭。
    misaka19000
        4
    misaka19000  
       2019-07-31 10:08:25 +08:00
    flutter
    34D
        5
    34D  
       2019-07-31 10:09:30 +08:00   ❤️ 1
    @CoCoMcRee 张口就来?你说的那些是什么培训出来的 iOS 开发。我所在的公司,和很多同事的公司都是招 iOS 开发招不到,不要把自己能力问题归结为社会现象。
    jewer3330
        6
    jewer3330  
       2019-07-31 10:09:59 +08:00
    php 天下第一
    xiangyuecn
        7
    xiangyuecn  
    OP
       2019-07-31 10:12:10 +08:00
    @manwei6341 膜拜大佬,能不能指点一下,任意对象转成字符串怎么写,比如一个方法传入任意对象(主要的还是针对传入的是 string、数字等肉眼可见(😁先这样描述吧)的对象)。还有对可能抛出异常的代码但没有 throws 的,如何去捕获抑制住这种异常?
    Carmine
        8
    Carmine  
       2019-07-31 10:12:55 +08:00   ❤️ 1
    现在入坑时机很好啊,ABI 稳定,容易学很多了~
    好好学,你会发现 iOS 滴工作真的不好找😭
    liuyx7894
        9
    liuyx7894  
       2019-07-31 10:13:25 +08:00
    一看就是没写过 js python 的....就用过 java?,你玩玩 js 再回来写 swift 你就会爽到
    xiangyuecn
        10
    xiangyuecn  
    OP
       2019-07-31 10:15:07 +08:00
    @CoCoMcRee 要写 app 啊,不然哪有精力去学这个,目前为止算是遇上的最难学的一个了,并非以找工作为目的,保住当前工作就阿弥陀佛了😂
    wbing
        11
    wbing  
       2019-07-31 10:17:46 +08:00 via iPhone   ❤️ 8
    好巧,我也是最近工作有个新需求要开发个 ios 客户端,也是从上周到现在都在学 swift。
    头两天也是一样查不少资料,最后是看这个系列文章
    https://www.appcoda.com.tw/hello-world-app-swift/
    还有这个视频入门的
    https://m.youtube.com/watch?t=10105s&v=09TeUXjzpKs

    现在用的挺顺手的了,比 c++容易
    hoyixi
        12
    hoyixi  
       2019-07-31 10:19:07 +08:00   ❤️ 1
    其实这是规律,书,还有市面上的收费课程,不说那些抄来抄去的,即使是用心做的,基本都是面向小白的,也就是领你进门,混个脸熟,知道个大概。

    接下来还得自己看文档,或者多看好的开源库的代码,或者一些比较稀有的好的博客文章的分享。然后就是自己动手实战~
    xiangyuecn
        13
    xiangyuecn  
    OP
       2019-07-31 10:19:39 +08:00
    @liuyx7894 #9 哈哈,反了反了,我最拿手的还是 js,Android、IOS 写布局什么的都太难写了,css 简单任性粗暴历史悠久,一直有个疑问,Android 布局里面有很多属性看起来和 css 很像,是不是借鉴的。
    zhangchioulin
        14
    zhangchioulin  
       2019-07-31 10:20:07 +08:00   ❤️ 1
    我有一些别的语言的经验 Objc 和 Python,一礼拜就基本上手了(都是看官方文档),还顺便写了个工具。。
    xiangyuecn
        15
    xiangyuecn  
    OP
       2019-07-31 10:21:58 +08:00
    @jewer3330 #6 忘了还有 php,比 swift 还难写,语法和 oc 倒是有些地方很相像,难写,还没入门就放弃了
    xiangyuecn
        16
    xiangyuecn  
    OP
       2019-07-31 10:23:37 +08:00
    @wbing #11 感谢,我去学习一下
    finab
        17
    finab  
       2019-07-31 10:25:48 +08:00   ❤️ 1
    Swift 最起码比 Java 好用太多了吧😀,你 java 都能写的话

    2.
    你可以直接使用 protocol, 如果有公共方法实现即可,不用用父类继承
    extension protocolName {
    }

    4.
    extension NSObject {
    func toString() {
    return "\(self)"
    }
    }
    xiangyuecn
        18
    xiangyuecn  
    OP
       2019-07-31 10:26:52 +08:00
    @hoyixi @zhangchioulin 嗯嗯,学了一下基本语法,上手写代码还是挺快的,但具体到 ios 里面的功能调用,就要慢慢摸索翻文档研究
    finab
        19
    finab  
       2019-07-31 10:28:10 +08:00
    4 手写忘了写方法返回值
    extension NSObject {
    func toString() -> String{
    return "\(self)"
    }

    var str:String {
    get {
    return "\(self)"
    }
    }
    }
    xiangyuecn
        20
    xiangyuecn  
    OP
       2019-07-31 10:30:05 +08:00
    @finab #17 19 学习了,还好继承的写法还没写几个类,待会全部改成这个写法😁
    PanPancf
        21
    PanPancf  
       2019-07-31 10:30:10 +08:00   ❤️ 1
    2. 要想让子类必须实现某些方法,可以通过 Base class 和 protocol 的组合来实现,也可以在父类实现里 fatalError,这样在你编码期间就可以保证发现没实现对应方法的子类。
    4. var description {get}
    5. 会 throw error 的函数签名里会有 throw 关键字
    Aixtuz
        22
    Aixtuz  
       2019-07-31 10:30:45 +08:00
    抄的还不带格式,我猜测很可能是 CSDN。
    zjddp
        23
    zjddp  
       2019-07-31 10:32:40 +08:00
    @34D 大佬能否放个 JD 看看?
    xiangyuecn
        24
    xiangyuecn  
    OP
       2019-07-31 10:32:56 +08:00
    @finab 不过 string 那个转换和直接"\(obj)"区别不大
    PanPancf
        25
    PanPancf  
       2019-07-31 10:35:36 +08:00
    Swift5 其实挺复杂了(虽然比不上 cpp 复杂哈哈哈),但学到够写一个 App 的程度并不困难,真正麻烦的是各种 framework API 的坑
    CommandZi
        26
    CommandZi  
       2019-07-31 10:35:53 +08:00
    protocol 还有 protocol 加上 extension、继承还有方法的 public 声明,已经覆盖 JAVA 里面的抽象类和接口的用途了
    xiangyuecn
        27
    xiangyuecn  
    OP
       2019-07-31 10:40:09 +08:00
    @PanPancf #21 子类的 17 楼的好些,刚查了一下 fatalError 是断言,这个是运行时检查吧,感觉如果测试时没有覆盖到所有方法还是会遗漏的。

    5.这个主要是昨天用到了 FileHandle.write 这个函数,帖子里面有 api 文档链接,它说会引发异常,却似乎没有任何检测异常的手段。

    4.我研究研究 description 这个属性。
    MuscleOf2016
        28
    MuscleOf2016  
       2019-07-31 10:42:18 +08:00
    @liuyx7894 真的吗,写 js 的来写 swift 会很爽?
    34D
        29
    34D  
       2019-07-31 10:42:54 +08:00
    @zjddp 最近在招有 iOS 逆向工程方面经验的工程师,来份简历呀.
    finab
        30
    finab  
       2019-07-31 10:44:14 +08:00
    @xiangyuecn 是的,就是根据你的习惯,把所有的继承自 NSObject 的类扩展出 toString()方法,具体实现都看你需求

    不过我平常用 "\()" 比较多,这个其实挺方便的
    xiangyuecn
        31
    xiangyuecn  
    OP
       2019-07-31 10:45:02 +08:00
    @PanPancf #25 哈哈,感谢,我研究研究 description 这个属性。
    dawn009
        32
    dawn009  
       2019-07-31 10:46:53 +08:00
    几个新兴的强类型、编译型语言里面{Swift, Go, Rust}我一直感觉 Swift 的学习曲线最平滑。Rust 是悬崖状,Go 是锯齿状。
    fghjghf
        33
    fghjghf  
       2019-07-31 11:02:53 +08:00
    @34D 你怎么自己不去调查一下?你觉得你一家公司能代表这个市场吗?他没说错,移动端 iOS 市场行情最烂,毕竟人口红利没了。
    PanPancf
        34
    PanPancf  
       2019-07-31 11:03:00 +08:00   ❤️ 1
    @xiangyuecn #27
    如果你 override 的方法是事件驱动的,那确实可能遗漏。
    FileHandle.write 这个方法比较特别,文档说明里会抛异常,但不是 Swift 的 throw Error 形式,这个 API 有历史问题,你可以再搜索一下是为什么。
    protocol 承担的其实就是 abstract class 的作用。( Swift 比 Java 优雅多了,Java 的 lambda 基本是个残废哈哈哈
    cgpiao
        35
    cgpiao  
       2019-07-31 11:13:05 +08:00
    我最不爽的是为什么方法签名那么长,都占了好几行了。
    34D
        36
    34D  
       2019-07-31 11:14:39 +08:00
    @fghjghf 你怎么自己不去调查一下?移动端市场不景气,就代表现在学 iOS 找不到工作,你只能说机会没以前多了,以前 iOS 井喷式爆发本来就不合理,现在只是趋于正常。你牛逼你会找不到工作?菜就是菜。
    wangleineo
        37
    wangleineo  
       2019-07-31 11:37:40 +08:00
    最受不了 swift 设计者对于字符串 API 的执迷,改来改去的让人崩溃
    xiangyuecn
        38
    xiangyuecn  
    OP
       2019-07-31 11:39:43 +08:00
    @PanPancf #21 测试了一下 自定义对象、数字、字符串、bool 类型,放在[String:AnyObject]字典里面,obj.description 结果和`\(obj)`的结果是一样的。换成[String:Any]字典,Any 类型不支持 description,还是`\(obj)`比较万能些,现在不纠结用哪个了😁
    xiangyuecn
        39
    xiangyuecn  
    OP
       2019-07-31 11:56:55 +08:00
    @wangleineo #37 一堆方法吓死人,单 swift 5 的截取字符串功能就研究了 1 天时间也没学会怎么写,最后自己扩展了两个 Substr(1,1),Substring(1,2)进行统一,不存在跨语言的障碍,清净了不少。

    做选择题是最轻松的,但选择一旦变多了可能就变成了填空题,条条大路通罗马并非一定是好事😎
    blless
        40
    blless  
       2019-07-31 12:00:54 +08:00 via Android
    @dawn009 #32 为啥我觉得 go 还比较平滑
    veightz
        41
    veightz  
       2019-07-31 13:33:37 +08:00
    16 年一个核心模块用 swift 写的我痛不欲生,后续几年接连因为 sdk 升级多次维护...
    语法变化频繁,向后兼容差。。导致 github 上看到的不少代码和语法无法参考,比较苦。
    所以对无 iOS 或者无编程语言的新人来说,不是太友好
    hell0v2
        42
    hell0v2  
       2019-07-31 13:55:07 +08:00
    习惯了 oc 之后,感觉还有那么点优雅?! 好像,应该是习惯了大部分语言后都会有亲切感。。
    qyizhong
        43
    qyizhong  
       2019-07-31 14:04:18 +08:00
    平时 OC 和 swift 都会写,说实话觉得 swift 写起来还是很爽的
    missnote
        44
    missnote  
       2019-07-31 14:57:10 +08:00
    入门,mark 后看,想学学不动啊。
    honeyCream
        45
    honeyCream  
       2019-07-31 14:58:49 +08:00
    @34D 作为一个 iOS 从业者来说,最近确实很苦恼.以前因为市场需求导致 iOS 开发者井喷,以致于标准很低.现在一些提高门槛的办法不是说全错,只是对于那些学历不高或者没有大厂经验的人来说确实不太友好.我也不知道你所说的技术好到底是什么水平,但是最起码不是人人都能做到百里挑一.
    honeyCream
        46
    honeyCream  
       2019-07-31 15:00:07 +08:00   ❤️ 1
    @xiangyuecn 如果是初学者的话,建议看 raywenderlich 这家的书,只不过是全英文的教材,不知道楼主能接受不.
    huruwo
        47
    huruwo  
       2019-07-31 15:22:30 +08:00 via Android
    2019 年加入国民党?
    ansonsiva
        48
    ansonsiva  
       2019-07-31 15:28:42 +08:00
    居然没人提 swiftUI ?
    ostholz
        49
    ostholz  
       2019-07-31 15:29:39 +08:00
    @wangleineo 不能同意更多。 比如要调用 subString, 这个痛苦
    AlexaZhou
        50
    AlexaZhou  
       2019-07-31 16:03:39 +08:00
    OC 比 swift 好用太多了,swift 一直说解决了很多问题,但在我看来 swift 带来的问题比解决的问题要更多
    meetocean
        51
    meetocean  
       2019-07-31 16:14:01 +08:00
    刚开始看不惯语法,一个多月之后就已经习惯,现在反而觉得很好用。

    去年今年都交了 100 美元,只要一交完钱,就没有精力开发,不交钱就心痒痒。现在换念念不忘第一款简单的游戏没有开发完成呢。
    34D
        52
    34D  
       2019-07-31 17:22:01 +08:00
    @honeyCream 我的意思是高级和资深工程师一直都紧缺,实在是前几年初级开发者太多了。最近也在招人,一大堆简历里连技术单词都拼错,而且一错就是 7,8 个,十几个,我都在怀疑,这人到底用过这个技术或者框架吗?面试的结果当然也在意料之中。那你说这样的人面了几家公司都被刷了,他对别人说,iOS 工作找不到,你信不?而且这真不是个例,面的初级工程师都是这样的,我觉得不是偶然。
    liuyx7894
        53
    liuyx7894  
       2019-07-31 17:40:48 +08:00
    @ansonsiva SwiftUI 必须 iOS13 才能用,你觉得最快几年后能用上?哈哈
    liuyx7894
        54
    liuyx7894  
       2019-07-31 17:50:29 +08:00
    @34D 大佬普通开发往逆向转的话,大概需要什么操作呢😄?什么程度可以找个跟普通开发平薪的工作呢?
    ansonsiva
        55
    ansonsiva  
       2019-07-31 17:50:54 +08:00
    @liuyx7894 #53 企业项目不知道,个人开发者。。。我已经跃跃欲试了,哈哈哈
    feikaras
        56
    feikaras  
       2019-07-31 17:52:14 +08:00 via iPhone
    liuyx7894
        57
    liuyx7894  
       2019-07-31 17:53:49 +08:00
    @ansonsiva 😄我已经玩了一段时间了,beta 版本 bug 还是不少的,不过即时刷新还是蛮爽的
    feikaras
        58
    feikaras  
       2019-07-31 17:56:16 +08:00 via iPhone
    @34D 真正会玩的人也不会在这种时候继续写 ios。要人不开好价格不就是请人滚。会玩的都会几个栈,一棵树吊死的才奇怪。
    harley27
        59
    harley27  
       2019-07-31 17:59:04 +08:00
    ios 是不是
    已经开始吃枣药丸
    honeyCream
        60
    honeyCream  
       2019-07-31 18:06:58 +08:00
    @34D 这可能就是因为前几年市场需求太大导致门槛太低所导致的吧,所以现在大公司招聘 iOS 都在提高门槛,这也算是最简单的节约人力成本的方式.

    另外如果贵司在上海的话,能不能麻烦给个 JD 看一下.或者可能的话,能不能站在用人方的角度来帮忙审核一下简历😂
    gee1k
        61
    gee1k  
       2019-07-31 18:21:20 +08:00 via iPhone   ❤️ 1
    从零学习 swift,写的一个 macOs 项目
    https://github.com/gee1k/uPic

    swift 两个最不习惯的地方:
    1.如果方法不抛出异常我都没办法 try catch
    2.类似 substring 这种操作用起来太复杂了
    GromHellscream
        62
    GromHellscream  
       2019-07-31 18:43:38 +08:00
    直接上 CS193P 就完事了
    ostholz
        63
    ostholz  
       2019-07-31 19:18:22 +08:00   ❤️ 1
    从 1.0 用到现在的 5.0, 确实感觉到 Swift 一直在进步。 比起写 ObjC 方便很多。特别是有 Playground 这玩意,随手就能写几行代码实验一下。

    另外,Apple 在 Swift 上投入了很多, 也寄与了很大的希望。 现在 Server 端 (Vapor, Kitura )也渐渐成熟。 也是一种选择。
    掌握 Swift 的一项附加好处是, 基本会了 Kotlin 的 60%。 两都 Syntax 很像, 有些地方思想也接近,比如 functional 这块儿。map/compactMap etc.

    所以, 为什么不花几周时间多研究研究呢?

    ps. 有没有觉得这玩意的复杂度也渐渐向 C++趋近
    XDDD
        64
    XDDD  
       2019-07-31 19:21:03 +08:00 via iPhone   ❤️ 1
    60 多楼了居然还没有人说出正确答案

    4. 唯一正确的方法是使用 String(describing:obj)。对于实现了 CustomStringConvertible 的类,可以使用 obj.description
    5. Swift 只有错误 Error,没有异常 Exception。如果你是指 Objective-C 中抛出的异常,你要记住,Objective-C 被设计为不可从异常中恢复,遇到异常应该直接崩溃,否则会漏内存。这不是 Swift 的锅。

    对于字符串:Unicode-Safe 是一个极其强有力的承诺,你需要学习如何写出 Unicode-Safe 的程序,同时避免不必要的性能浪费。
    XDDD
        65
    XDDD  
       2019-07-31 19:38:17 +08:00 via iPhone   ❤️ 1
    如果你发现有些设计难以理解 /不会使用,而又十分明显,是因为这些设计没有对 类型安全 /内存安全 /性能安全 /Unicode 安全 妥协。
    ArJun
        66
    ArJun  
       2019-07-31 20:14:02 +08:00
    好好学,你会发现 iOS 滴工作真的不好找哈哈哈
    XDDD
        67
    XDDD  
       2019-07-31 20:22:52 +08:00 via iPhone   ❤️ 1
    关于 2:
    你并不关心类的继承关系,你只关心一个 variable (而不仅是 object )可以做什么。这叫做 protocol,而非 abstract。abstract 是中了面向对象的毒。
    zsk425
        68
    zsk425  
       2019-07-31 20:48:28 +08:00 via Android   ❤️ 1
    关于 6,其实 Xcode 相比 gradle 是傻瓜式的,几乎所有配置都有图形界面,依赖管理一般用别的工具(如 cocoapods ),至于自定义 task,Xcode 在 build phase 里可以实现部分,更复杂的编译设置可以用命令行工具。
    yikuo
        69
    yikuo  
       2019-07-31 21:33:22 +08:00 via Android
    @finab 通过 protocol+extension 这种方式可以为协议提供默认方法,但在声明这个协议的类里面要么不实现直接用这个默认方法,要么完全重新实现。这样做不到先调用 super.xx 然后实现其余逻辑,没法完全代替 abstract,有没有好点的办法?然后就是没有 protected,有替代方式吗?
    fghjghf
        70
    fghjghf  
       2019-07-31 21:51:36 +08:00
    @34D 我 4 年前就从 iOS 转去后端了,之前经历过 3 年 iOS 开发,还吃过一大波红利,只要要说 iOS 开发我现在技术的确很菜,谢谢!你是怎么理解如何叫行情不景气?假设有 10 个坑,10 个人去抢这就是最优解! 8 个人就是供不应求,20 个人就是供大于求!现在的 iOS 就是第三者情况。对最中低层极不友好!现在入行比 50 入国军更残酷。任何一个人做到行业上层都能找到工作,仔细理解下我说的话,这又和我提的论点有什么关系?用你的逻辑,我是否可以证明任何行业其实都很蓬勃,无论是已经退出市场都 BB 机维修员、电影放映员、供销社职员,还是现在火热的行业岗位。只要你能做到行业上层。不用看冰冷的招聘数据了,就我身边很多朋友包括我老婆,都是做 HR 的,从他们口中得出,移动端行情的确比后端差。
    winglight2016
        71
    winglight2016  
       2019-07-31 21:58:18 +08:00
    swift 已经挺好了,lz 觉得难用可能是习惯了 java,但是毕竟诞生时间差了 10 多年,设计思路差别很大,如果开发过 js 或者 python 可能就会感觉很类似。个人体会,学一门新语言最大的障碍就是思路转不过来,比如,从 think in java 转到 think in js/python 的确很不适应,但是基本上做完一个项目就好多了。找不到资料的问题,大概用了中文在百毒搜索? google 英文关键字感觉会准很多,之前发现搜索中文出来在 csdn 上的文章会有意无意的给人挖坑,我就再也不用中文搜了。
    mxalbert1996
        72
    mxalbert1996  
       2019-07-31 22:01:32 +08:00 via Android   ❤️ 1
    看了 64 楼终于有人提到 String(describing:)了。。。我就奇怪了这么多人难道都没看过 String 的文档吗?
    xiangyuecn
        73
    xiangyuecn  
    OP
       2019-07-31 22:16:03 +08:00
    @XDDD #64 65 67 膜拜大佬,受教了🤞
    xiangyuecn
        74
    xiangyuecn  
    OP
       2019-07-31 22:21:36 +08:00
    @mxalbert1996 #72 连 string 的一些算是比较基础的功能也要研究文档,太心累了😂

    真实画风是这样的:String.init(describing: CustomStringConvertible & TextOutputStreamable) ,如果没有研究过,就算 xcode 里面显示了这个方法,也不太可能会去调用这个方法,CustomStringConvertible 是谁?这个对象有没有继承 CustomStringConvertible ?一脸楞逼😂

    当然现在提点一下就知道原来还有这个玩意可以用。
    onevcat
        75
    onevcat  
       2019-07-31 22:47:02 +08:00   ❤️ 5
    1. 不知道你看的什么书..如果不小心是我写的话,只能说抱歉...😂 官方教程对于语言来说很好,但是和 iOS 关系不大。建议的话去看 CS193p。
    2. Protocol > Inheritance。Swift 不是一门传统的“面向对象”的语言,只是能写父类而已。抽象类这种设计争议本来就很大,在 Swift 里没有提供。你的情景的话,protocol 配合 extension 比较像。如果你有强烈的子类或者抽象类需求,说明你的架构哪里出了问题,不是 Swift Style 的代码。
    3. 这个世界的运行规律就是如此。
    4. 看你想要转成什么样的字符串..."\(obj)" 哪里丑了?你是指转出来的结果丑?自行实现 CustomStringConvertible 或者 CustomDebugStringConvertible 即可。
    5. FileHandle 这种上古年代的东西,除非真的有强烈需求在这种层次上操作,应该很少有人用了。这片的错误处理是 NSException 负责的,要用到 ObjC 的 `@try @catch`,是非常丑陋的写法。你可以认为是三四十年前的遗留代码。这个问题在很久以前就有[讨论和提出]( http://openradar.appspot.com/30537361),但是 ObjC 的时候就用了非常糟糕的设计方式,导致 Interface 自动转换的时候不能按照惯有的 error 处理来搞定这个,也没有强行去改的可能性。纯 Swift 基于 C 的 Foundation 封装倒是[解决了这个问题]( https://github.com/apple/swift-corelibs-foundation/blame/master/Foundation/FileHandle.swift#L504),但在 iOS 的话个人还是推荐自己用 ObjC 封装一遍。
    6. Xcode 项目从来都不是让你用人工编写的..请使用 Xcode GUI。

    还有什么不明白的可以随时提出..有空的话也许能帮得上忙。
    6.
    5.
    onevcat
        76
    onevcat  
       2019-07-31 22:49:43 +08:00
    V2EX 在回复里居然不支持 markdown 么...||| 这可真蠢
    cht
        77
    cht  
       2019-07-31 22:54:32 +08:00
    @onevcat #76 哈哈膜大佬,之前在 GitHub follow 过,居然在 v 站看到了 😁
    cht
        78
    cht  
       2019-07-31 23:06:58 +08:00   ❤️ 1
    自己接触 Swift 之前基本没有写过现代的 OOD 的代码。直接从零学习 Swift 后再读 C++,觉得 Swift 还是轻松太多了,没有旧的语言的历史包袱。

    Swift 值得诟病的一点就是字符串处理,为了 Unicode 和性能优化不如传统语言或者 Python 那样简明。
    另一点是 Apple 的官方库文档有时记载地不够全面,有些隐藏条件需要试才能知道,这一点不如成熟的语言。

    String interpolation 的形状确实和其他语言不太一样,不过如果先入为主的话反而会觉得很方便。自己写 Python 的时候很喜欢用 f-strings,转到 Swift 甚至更加流畅了。

    对我这种入门者而言 Swift 最爽的就是 closure 以及 GCD 的多任务管理,以及 iOS 平台无数基础功能的官方库。比起写 C++ 来说轻松太多了 ❤️
    lh948
        79
    lh948  
       2019-07-31 23:09:21 +08:00
    @onevcat 膜拜
    xiangyuecn
        80
    xiangyuecn  
    OP
       2019-07-31 23:55:43 +08:00
    @onevcat #75 膜拜大佬,前些天刚刚收藏了喵神的博客慢慢学。现在写的 swift 代码和 java 一个风格😂。昨天找 outputstream 资料的时候,没有找到,因为要文件内任意位置写二进制数据,首先搜索的就是 swift outputstream,没有找到什么有效的资料,看到人家用的比较多的还是 filehandle 这个,就照着人家写的代码来用了。看文档这个对象是有点老,SDK 支持 iOS 2.0+。

    刚又去 Foundation 文档里面看了一下,《 File System 》这节里面只有 FileHandle 类像流。最后看了一下《 Streams, Sockets, and Ports 》这节,原来文件流在这里面;这个标题真不好,Sockets 和 Ports 这两个词一眼看过去和文件几乎没有什么关联,还以为是网络请求方面的😂

    每次提交代码的时候看到 project.pbxproj 里面的变更都是一脸楞逼的状态,所以就吐槽了一下,不过说不定以后可能会手动去修改这类文件。
    chipmuck
        81
    chipmuck  
       2019-08-01 00:17:41 +08:00
    @onevcat 这两个链接看得出戏 [手动狗头
    geying
        82
    geying  
       2019-08-01 02:58:40 +08:00
    最近也在看 ios
    可以去 YouTube 上找一些简单的应用教程
    swift 基本语法会就 ok 了 也就是视频里写的大多都能看懂 看不懂的语法再去看文档或者百度
    tomoya92
        83
    tomoya92  
       2019-08-01 07:54:16 +08:00
    tomoya92
        84
    tomoya92  
       2019-08-01 07:55:37 +08:00   ❤️ 1
    madtcsa
        85
    madtcsa  
       2019-08-01 08:28:15 +08:00
    IOS 开发,除了 Xcode 比较难用。其他的都很好。
    Swift 很好用,除了 let arrary = [String]() ,鬼知道设计者咋想的,声明为 let 的数组不能更改数组元素
    xiangyuecn
        86
    xiangyuecn  
    OP
       2019-08-01 08:58:04 +08:00   ❤️ 1
    @tomoya92 #84 点开看了一下大佬的博客,发现一个灰色链接,原来是昨天已经看过了一篇文章,好巧吧😁

    《 swift4 WKWebView 使用 JS 与 Swift 交互》不过这篇文章内容当时看时感觉和别的文章一样,千篇一律。wkwebview 搜索到的 js 调用 swift 代码基本上都是通过 webkit.messageHandlers。这个路子我没有试过,但明显有致命缺陷:不能同步返回调用结果,简单的功能调用,都要走重量级延迟的 callback。

    目前 js 调用 swift 代码我采用的 swift 端重写 prompt 弹窗界面,今天还在完善这里面的接口。js 的 prompt 有个特性是:同步+支持输入(标题、默认值)+支持输出(返回文本结果),其实是用的 Android 4.x 过气版本的老路子,但并未发现 ios 有类似的文章。
    free9fw
        87
    free9fw  
       2019-08-01 09:06:15 +08:00
    明显 lz 能力欠佳
    xiangyuecn
        88
    xiangyuecn  
    OP
       2019-08-01 09:07:13 +08:00
    #86 刚才又搜索了一下“ ios wkwebview js ” 没有同步返回结果相关的文章,但加一个同步关键字“ ios wkwebview js 同步”就有了一大堆类似的方案😂 遇到问题时往往就是这样,关键时候搜不到,平时搜索一大堆😁
    xiangyuecn
        89
    xiangyuecn  
    OP
       2019-08-01 09:08:14 +08:00
    @free9fw #87 被你发现了😁 有人指点一下会好很多呀
    finab
        90
    finab  
       2019-08-01 09:56:29 +08:00
    @yikuo 可以看看上面喵神的解释,如果实在要这样,继承某个父类吧,
    好像也没有可替代 protected 修饰符的,稍微有点像的可以用 fileprivate,然后将子类写在一个文件里
    你可以搜一搜 Swift protected 看看相关的讨论
    finab
        91
    finab  
       2019-08-01 09:56:52 +08:00
    @XDDD
    @mxalbert1996
    难道 "\(obj)" 不是相当于 String(describing:obj) ???
    wxl1380610
        92
    wxl1380610  
       2019-08-01 10:00:40 +08:00
    现在前端坑很多 , 还是学前端吧 ?
    mxalbert1996
        93
    mxalbert1996  
       2019-08-01 12:22:25 +08:00 via Android
    @finab 你再读一遍楼主的第 4 个问题
    jevonszmx
        94
    jevonszmx  
       2019-08-01 13:05:59 +08:00
    @Aixtuz 从 csdn 就看得出来,百度的技术真的烂,被 csdn 这种采集站玩坏了
    finab
        95
    finab  
       2019-08-01 14:19:28 +08:00
    @mxalbert1996 然后呢?
    mxalbert1996
        96
    mxalbert1996  
       2019-08-01 14:23:18 +08:00 via Android
    @finab 楼主自己说觉得"\(obj)"有点丑问有没有更正式的方法,然后现在有人回答了你来说这两个不是一样么,废话本来就是一样的啊,只是回答了楼主的问题而已。
    finab
        97
    finab  
       2019-08-01 14:28:19 +08:00
    @mxalbert1996 喔,明白,但我其实是回另外一个人的 “唯一正确的方法是使用 String(describing:obj)” ,

    之前已经有人说了 “\(obj)” ,但是他说 到他那为止,还没人说出正确方法, 唯一 正确的方法是 String(describing:obj),
    然后我回复
    难道 "\(obj)" 不是相当于 String(describing:obj) 么, 怎么"\(objc)" 就不是正确的方法
    fvckDaybyte2
        98
    fvckDaybyte2  
       2019-08-01 14:42:55 +08:00 via iPhone   ❤️ 1
    2 swift 子类可以继承 extension,oc 的话直接继承 category,子类必须强制实现里面的方法

    5 写 ios 无论 oc 还是 switft 都没用过 try,处理异常通常都是 completion block 读 NSError ……如果异常会导致段错误或者 crash 都是提前规避…… try 虽然支持,我自己从未用过😂
    xiangyuecn
        99
    xiangyuecn  
    OP
       2019-08-01 14:59:42 +08:00
    @fvckDaybyte2 #98 swift 不用 try catch 的写法能不能举个例子呢,还有某个方法调用可能会导致异常,该怎么提前规避呀
    fvckDaybyte2
        100
    fvckDaybyte2  
       2019-08-01 16:47:32 +08:00   ❤️ 1
    @xiangyuecn

    func requestForUserDataWith(_ parameters: [String: String], completionHandler: (_ result: [String: Any], _ error: Error) -> Void){
    //.. Code process
    }

    如果这个方法有异常(错误)就是直接在 completionHandler 里返回,就是把 java 里面的 throw 替换成 return,catch 替换成 completionHandler...
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3090 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 52ms · UTC 14:07 · PVG 22:07 · LAX 06:07 · JFK 09:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.