学习 ios ( Swift ) 开发一个多礼拜的心得:入门到放弃 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
xiangyuecn
V2EX    程序员

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

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

    学了一个多礼拜,看了 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  
    P
       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 这家的书,只不过是全英文的教材,不知道楼主能接受不.
        47
    huruwo  
       2019-07-31 15:22:30 +08:00 via Android
    2019 年加入国民党?
    huruwo
    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 才能用,你觉得最快几年后能用上?哈哈
    /tr>
    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 这种操作用起来太复杂了
        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     Solana     2981 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 34ms UTC 13:02 PVG 21:02 LAX 06:02 JFK 09:02
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86