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

2019-07-31 09:41:08 +08:00
 xiangyuecn

学了一个多礼拜,看了 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 看起来像写甲骨文,学不动)。入门到放弃!但真放弃却是不可能的,慢慢磨吧。有大佬指点迷津就更好了😊

16811 次点击
所在节点    程序员
116 条回复
gee1k
2019-07-31 18:21:20 +08:00
从零学习 swift,写的一个 macOs 项目
https://github.com/gee1k/uPic

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

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

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

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

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

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

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

当然现在提点一下就知道原来还有这个玩意可以用。
onevcat
2019-07-31 22:47:02 +08:00
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
2019-07-31 22:49:43 +08:00
V2EX 在回复里居然不支持 markdown 么...||| 这可真蠢
cht
2019-07-31 22:54:32 +08:00
@onevcat #76 哈哈膜大佬,之前在 GitHub follow 过,居然在 v 站看到了 😁
cht
2019-07-31 23:06:58 +08:00
自己接触 Swift 之前基本没有写过现代的 OOD 的代码。直接从零学习 Swift 后再读 C++,觉得 Swift 还是轻松太多了,没有旧的语言的历史包袱。

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

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

对我这种入门者而言 Swift 最爽的就是 closure 以及 GCD 的多任务管理,以及 iOS 平台无数基础功能的官方库。比起写 C++ 来说轻松太多了 ❤️
lh948
2019-07-31 23:09:21 +08:00
@onevcat 膜拜
xiangyuecn
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 里面的变更都是一脸楞逼的状态,所以就吐槽了一下,不过说不定以后可能会手动去修改这类文件。

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

https://tanronggui.xyz/t/587738

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

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

© 2021 V2EX