老夫之前几乎从来没有用过这门语言,但由于维护代码的小伙伴还有其它事情占着手,只好临时顶上。
虽然 ChatGPT 已经一年多了,但由于各种使用上的封堵导致心理上还没有将其接受作为寻找问题答案的第一选择,故而还是从搜索引擎起步,前卫的技术流小朋友们勿怪。况且本文中的技术点不是难度所在,是“用一门新语言在一个较少接触的开发平台下实现这个功能”略有不便。
Swift 从计算机科学领域的编程语言学角度来看,跟 Kotlin 语言有很多的相似处,不过这是横向比较。纵向比较的话,与苹果自家原先那个糟糕到无以复加的 Objective-C 也颇有渊源。尤其是语言之上的基础设施的构造方面,就尽可能平滑地迁移了很多历史遗产过来,很多类都能在 OC 中找到其祖先,相当多都是去掉了之前的 NS 前缀就是了。
所以,搜到的第一篇(当前是经过粗略的一眼筛选后留下的)就基本上可以搞定三太爷的疑问的,就是这个:https://stackoverflow.com/questions/55991262/send-multi-part-form-data-in-swift。其中 boundary 的生成让老夫不禁回想起 1999 年,还在和老陈吭哧吭哧写邮件转发系统的时候,为了在报文中生成随机不同的 boundary 都得思忖半晌,现在直接用固定前缀带一个 GUID 就搞定了。原始提问的 PO 还在代码里用着 NS 开头的老旧类呢,被下面的答主给纠偏了。
基本问题解决后,还想再拓展一下,这也是我一贯的做法。所以又找到了几篇博文看,一篇是 https://igomobile.de/2020/06/16/swift-upload-a-file-with-multipart-form-data-in-ios-using-uploadtask-and-urlsession/,另一篇组织结构以及视觉效果都更清晰清爽一些,在这里:https://orjpap.github.io/swift/http/ios/urlsession/2021/04/26/Multipart-Form-Requests.html。其中提及一个老夫很久之前就有所耳闻的 iOS 上的网络库,叫 Alamofire,这次就不杀鸡用牛刀了。如果你追求 Swift 5,或者老年人需要更大的字体,还可以看这篇从日期上看最近的:https://theswiftdev.com/easy-multipart-file-upload-for-swift/。
如果你只想尽快复制粘贴代码,还可以打开这个地址:https://gist.github.com/codecat15/6c1eaa5b7ea48b26b10d907fef68abf2。实话说,代码写得很一般,不过既然作为一个项目上传到了 GitHub 上,三太爷赌他应该运行成功过,仅此而已。
其实在实现服务端接收的时候,老夫操起二十年不用的 PHP 也仍然犯了一些低级错误,最频繁的是:调试过程中 echo
语句总是因为心急而忘记语句结尾的分号,然后导致脚本错误而停摆。感觉一刻钟的调试过程,平均一分钟一次,真是见了鬼了。当然也有自我感觉不错的地方,第二个接口,几十行的脚本写完,除了把 strlen 靠直觉写成了 len 是个错误外,把丢失的 str 三个字母加上就完全正常地、欢快地跑成功了。