(挖坑自己跳系列三)
在实现文件操作的时候我意识到了一个事实:由于NSURL是可支持的路径,很多文件的操作实际上可以扩充到网络上去,比如从网上下载一个文件、拿取一些数据……想到这里,埋藏在心中很久的愿望又开始蠢蠢欲动:写一个新闻客户端!
我有一个常看的新闻网站(不要问我是哪个,要FQ),官方客户端很难用,第三方广告满天飞,严重影响心情。所以当初开始学iOS的时候就把重做一个客户端的目标放在了首位。最开始的时候想得太简单,兴冲冲地开了个project,搞了两下TableView,然后发现……对于我这种从来只写底层代码,swift/OC语法都不会的人,做这个简直是异想天开好嘛!
折腾的过程中,为了拿到数据,还跑去下了Android的官方客户端反编译,find + grep出来了人家的数据接口地址(论一个爱折腾的程序员是怎么给自己挖坑的),返回的是XML数据,连蒙带猜试了试,可以用!不过后来做UI受挫(其实不止做UI,挫败感太大),就把那份东西闲置起来了。这两天突然想起来,现在我貌似感觉有点良好,何不捡起来继续写我的客户端?
因为UI我还一窍不通,不懂怎么调试,也不懂怎么把数据显示出来,为了避免到处打印的麻烦,我选择playground。这样也就是需要用原生库,这个很简单,搜一下就有了:NSXMLParserDelegate,还有好些源码,虽然大多是OC的。
问题是有源码,我依!然!看!不!懂!怎么用!每个教程都是扔了源码上来,可没人解释清楚到底怎么运行。我研究了好一阵,终于明白了大概的机制:

自己写一个类继承NSXMLParserDelegate,就叫它XmlReader吧;并且实现一些必须的callback函数,在XmlReader的Init中调用.parse()方法,最后在new XmlReader的时候就会自动完成整个parse了

阅读全文 »

(挖坑自己跳系列二)
上回说到文件操作,那就把文件操作来一遍吧,先放源码:GitHub某个地方

初始化 & 文件路径

所有的文件操作都要先声明一个根控制器以获得文件的句柄:

let manager = NSFileManager.defaultManager()

而文件路径的表示有两种方式:String和NSURL。在NSURL的视角中,本地文件作为一种特殊的网络文件而存在,以“file://”开头。多数的操作对于两种路径方式都有两个相对应的接口,要注意对于NSURL,表示本地文件时必须以“file://”开头,否则很多API会失败。为了测试方便,我给String加了个转换的扩展:

extension String {
    var toFilePathURL : NSURL {
    let url =  NSURL( fileURLWithPath: self)
    return url
    }
}

这里使用参数fileURLWithPath:而不是string:就是为了上述原因。
对于路径的修改,String表示方法很简单,直接相加即可;NSURL需要用以下代码:

阅读全文 »

好几天没做总结了,一直被写code的欲望牵引着,噼里啪啦打了很多code,也走了很多弯路。好多时候,突然搞定的时候,才发现自己真真像个新新手一样,给自己挖了好多坑,真是傻到家了!
好在我一直觉得,在debug上浪费的时间通常都不会是彻底浪费掉的,总有那么一些东西是留在脑子里,通俗地来讲,就是经验。是时候把过程理一理,记录下来了。
之前也说过,之所以把String顺了一遍,其根本缘由是想找到一个编码转换的函数,把我那些下载下来的书名乱码都改过来。后来编码是解决了,但改名还需要自己来……于是我琢磨着给Mac写个文件pickup的界面?刚巧看到源码推荐一个swift开源的命令行增强工具,突然意识到swift也是可以直接编译跑在终端的!做起来简单得不能更简单(先要装好Xcode command line tool,如果没装,在终端跑xcode-select --install):

swiftc test.swift//生成一个test二进制程序
./test

这是有编译过程的,更省事的是直接跑了:

swift test.swift

当然这个swift命令还有更多用法和参数,

阅读全文 »

Swift中的字符串,第六篇,正则匹配。其他的几篇传送门:

对于字符串的操作来说,正则匹配算是很重要的一项应用了。虽然其实我不太用,但偶尔需要的时候还是感到这东西真挺有用的。在网上找了找,对于iOS中使用正则,基本上都是说有三种方法,可惜给的Swift源码比较少,版本问题也不能直接跑,于是自己动手做一遍。总结了下其实所谓的三种方法其中两种还是很有局限性的。

首先我们定义好待匹配的字符串和pattern:

let str = "18800002222---13144445555"
let pattern = "1[3|5|7|8][0-9]\\d{8}"

简单示范,就不搞太复杂了。这个pattern是手机号码的正则,因为准备demo匹配多个结果,没有加开头和结尾的限制。

阅读全文 »

Swift中的字符串,第五篇,常用NS-XXX系列的类型转换。其他的几篇传送门:

刚开始碰String的时候着实被各种繁琐的操作折腾得不轻,不能随便取字串、比较、赋值,不能获得实际编码值……往往想干点什么,一搜,就是NSString,NSData的API,晕头转向。研究了一阵子编码,慢慢也摸清了这些数据类型和它们的方法,简单总结一下互相转换的方法,给新手一点方向。这篇文章里的类型包括了String, NSString, NSURL, NSData这几种,String是Swift的字符串类型不用多讲,封装得很豪华但各种概念多用起来有点麻烦;NSString是OC里面的字符串,但有很多实用且方便的API;NSData其实属于无差别的Data类型,存储字符串的话是RawData,有点像C语言里面的string,其实是数据块;NSURL专门用来表示网络地址,有一些网络相关API。

阅读全文 »

Swift中的字符串,第四篇,中文字符编码的转换。其他的几篇传送门:

不知道是不是Safari的原因,我用浏览器下载中文名文件的时候常常文件名会变成乱码,就是“%EF%77%3D%20”那种,又因为很多是电子书,名称也不能乱改,还需要自己去copy一遍重命名,很烦,于是想到用Swift自己写个函数试试纠正这个乱码。

阅读全文 »

这篇都不知道该算吐槽还是开发文章😀。
早晨起床一刷新闻,Swift承诺中的开源实现了!想想读书的时候写Pascal玩,进了大学才发现原来这玩意儿早过时了,大学的时候也是东搞西搞像无头苍蝇一样没有方向,偶尔有需要写程序的偏门作业就突击什么vfox, delphi, jsp之类的……等毕业工作半年了才开始学C,后来对着个Android1.2研究了下就觉得一层一层好复杂啊!😥这么些年永远走在潮流之后,什么GitHub是什么鬼从来没用过,学习Swift的过程就跟不断发现新大陆一样感觉信息爆炸性扑面而来,这次突然有一种自己终于跟上了时代的感觉,哈哈!
下午跑去Github上观光了一下Swift,手贱Watch了,结果十几分钟来了20封邮件!吓得我赶紧去unwatch,终于懂了为什么star的那么多watch的却很少了。这效率让我有点瞠目结舌:才一天,搭搭环境看看代码结构就差不多了吧,哪里来那么多大神神速找了bug出来还fix了!!膜拜的同时心生自卑:人家是怎么做到的?是我智商低吗?难道说这就是老人被拍死在沙滩上的真实写照……😱
看看文档,Swift3.0还要大改,居然都有计划做什么2.0到3.0的迁移器,那多半是改动多得大项目根本无法用人力迁移了。1.2到2.0的改动就够让我晕头转向的了,还没整明白呢,又来,我也真是醉……跟钱同学讨论这个问题,他相当不能理解这种不稳定性,觉得iOS开发者都这么好脾气吗?!其实我一个月前也不能忍,那种随便一找资料就过时、网上几乎所有的sample都编不过又不知道怎么改的感觉太令人抓狂,不过随着慢慢入门,这种感觉就好多了,也知道如何应对。也许对于这种剧烈变动的语言,亦步亦趋比猛插一杠子开干还是要容易吧!
最近读了一些文档、文章,感觉自己虽然语法差不多知道了些,思维却还是旧式的。对于那些流行的(或者其实是已经用了很长时间了,只是我不知道)的编程思想和范式,还很陌生。这种思维方式的转变,需要更多的时间来磨练和体会,不求成为大牛,只想做一个不是吃青春饭的工程师。给自己加油!🤗

本系列第三篇,String相关的类型转换。其他的几篇传送门:

虽然Swift是强类型语言,但简单的String类型转换其实还是比较方便的,最暴力的就是强制类型转换,百试百灵:

func toString<T>(a: T) -> String{
    // Way one, format
    //return "\(a)"
    // Way two, new string
    return String(a)
}
toString(123)
toString(0.007)
toString([4, 8, 32, 5 ])
toString("test".startIndex)

同样照葫芦画瓢也能转回来:

Int("123")
Float("3.1")

但这个太简单、太有局限性了!我最喜欢的是下面这个,利用了New的时候format方法,简直就是sprintf()的替代品!

阅读全文 »