关注我的小伙伴们和看过我之前文章的小伙伴们,一定知道,之前我写过几篇swift基础知识的文章,当时也是自己想要系统的从基础知识开始学习一下swift。但是没有坚持下来,很尴尬。。。大概是因为我懒,就不为自己找别的理由了。
最近偶然在掘金社区里有看到大佬们分享的swift学习的经历和资料,真是很佩服他们的学习能力和毅力以及分享的精神。所以我也打算再把放了很久的swift再重新拾起来,跟着大佬们的步伐继续学习。
可能看到这篇文章的你,也和我有过同样的困扰,时刻告诉自己,作为一名iOS开发者,swift已经是必须要具备的能力了,但是工作中用不到,公司项目还是OC,没有实践的机会,就觉得学了不用很快就会遗忘。那么如果你看到这篇文章,希望你也可以和我一样下定决心,继续一起学习swift,我也是从入门开始,我们一起互相监督鼓励。学习的路上真的需要几个志同道合的朋友。
本文会不定期(我尽量定期一直)更新,看到文章的同学我们一起开始swift的学习吧。我自己写的代码都会上传到GitHub供大家参考,如果发现有不对的地方,欢迎随时指出。
00 day
在学习的最开始,建议大家可以去看看我之前写的关于swift基础知识点的文章,再开始动手写swift。主要是为了熟悉一下语法,其实我们有比较深厚的OC功底,写swift上手应该比较快。
xcode12中把playground的新建放到了这里,如下图:
run playGround 可以自己设置快捷键:
建议
- 主要看一下基础语法和数据类型
- 字符串、集合类型的操作
- 函数
- ...
01 day
一个简单计数器
,每秒+0.1,有开始、暂停、复位功能。
知识点:
- 使用了故事板直接拖拽的控件
Timer
只是简单的创建和销毁
open class func scheduledTimer(timeInterval ti: TimeInterval, target aTarget: Any, selector aSelector: Selector, userInfo: Any?, repeats yesOrNo: Bool) -> Timer
open func invalidate()
复制代码
- 属性监视器
var count:Float = 0.0 {
// 属性观察
didSet {
secondShowLabel.text = String(format: "%.1f", count)
}
willSet {
//属性值改变前 do something
}
}
复制代码
02 day
使用自定义字体
知识点
- 字体拖入工程中需要在info.plist中设置
<key>UIAppFonts</key>
<array>
<string>Gaspar Regular.otf</string>
<string>MFJinHei_Noncommercial-Regular.ttf</string>
<string>MFTongXin_Noncommercial-Regular.ttf</string>
<string>MFZhiHei_Noncommercial-Regular.ttf</string>
</array>
复制代码
- font的设置方法
self.textLabel.font = UIFont.systemFont(ofSize: 17)
textLabel.font = UIFont.init(name: self.fonts[fontIndex], size: 17)
复制代码
03 day
UITextView
的简单使用
知识点
- UITextView的delegate使用,和OC 很类似
- 字符串的截取
func prefix(_ maxLength: Int) -> Substring
Substring
这个类型感兴趣的可以深入去了解一下,比如下面的代码中,substr是和str共享了同一块内存,所以对substr的操作更加高效和快捷,而且Substring
和String
一样都实现了StringProtocol
,StringProtocol 抽象了字符串的常见功能,比如 uppercased(), lowercased(),还有 comparable、collection 等。但是也同时改变了str的生命周期,所以在后面使用时还需要再转化为String
。
func textViewDidChange(_ textView: UITextView) {
let currentCount = textView.text.count
if textView.text.count > 50 {
if let str = textView.text {
textView.resignFirstResponder()
let substr = str.prefix(50)
textView.text = String(substr)
}
} else {
limitLabel.text = "\(50 - currentCount)"
}
}
复制代码
04 day
UITableView
的简单使用
知识点
UITableView
的创建和delegate的使用
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return dataArray.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell(style: .default, reuseIdentifier: "cellIndentifer")
cell.textLabel?.text = dataArray[indexPath.row]
return cell
}
复制代码
05 day
UICollectionView
的基础使用
知识点
- 这个demo使用了
storyboard
,可以顺便复习一下故事板的使用和约束添加 UICollectionView
的delegate
、dataSource
由VC去实现UICollectionViewDelegateFlowLayout
必须实现
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return CGSize(width: UIScreen.main.bounds.width - 60, height: 450)
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
return 30
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
return UIEdgeInsets(top: 0, left: 30, bottom: 0, right: 30)
}
复制代码
06 day
做了一个xcode的extension,放在这里可能有点儿超纲,毕竟才刚开始写swift,其实用Objective-C写也完全没问题,就是拿来练练手的,代码也不算多,感兴趣可以看看。
功能是匹配到代码中的十六进制色值,在该行代码后面备注色值对应的颜色。
知识点
- 正则匹配
NSRegularExpression
的使用,NSRegularExpression 在iOS中表现为迭代器方法,意思就是每当匹配到正确的匹配法则就会返回一部分给调用者。
func findHex(string: String) -> String? {
let pattern = "\"#?[A-Fa-f0-9]{6}\""
guard let range = check(string: string, pattern: pattern) else {
return nil
}
return (string as NSString).substring(with: range)
}
func check(string: String, pattern: String) -> NSRange? {
let regex = try? NSRegularExpression(pattern: pattern, options: [])
return regex?.firstMatch(in: string, options: [], range: NSMakeRange(0, string.count))?.range
}
复制代码
- 条件语句guard,这是个swift对于OC来说的一个不同点,刚接触到可能会不太习惯这种判断方式,多用体会它的优势。其实就是
先把条件列出来,不满足的直接return,满足条件才走下面的代码
。
func perform(with invocation: XCSourceEditorCommandInvocation, completionHandler: @escaping (Error?) -> Void ) -> Void {
// Implement your command here, invoking the completion handler when done. Pass it nil on success, and an NSError on failure.
guard let selection = invocation.buffer.selections.firstObject as? XCSourceTextRange else {
completionHandler(nil)
return
}
let lineNumber = selection.start.line
guard lineNumber < invocation.buffer.lines.count, let line = invocation.buffer.lines[lineNumber] as? String else {
// 不满足lineNumber < invocation.buffer.lines.count, let line = invocation.buffer.lines[lineNumber] as? String这个条件 则return
completionHandler(nil)
return
}
guard let hex = findHex(string: line) else {
completionHandler(nil)
return
}
let newLine = process(line: line, hex: hex)
invocation.buffer.lines.replaceObject(at: lineNumber, with: newLine)
completionHandler(nil)
}
复制代码
07 day
今天还是做了一个xcode的extension,功能是删除选中代码段中的空格,可以用来做日常的代码format。
知识点
defer
defer
语句在代码块作用域退出之前执行
一个代码块中允许多个defer
执行顺序从后往前
func perform(with invocation: XCSourceEditorCommandInvocation, completionHandler: @escaping (Error?) -> Void ) -> Void {
// 先执行后面的invocation.deleteEmptyLines() 最后执行completionHandler(nil)
defer {
completionHandler(nil)
}
invocation.deleteEmptyLines()
}
复制代码
举几个实际使用的例子,比如文件操作最后都要close,可以提前把close的代码放入defer中;比如网络请求最后都要block出去error和response,也可以放入defer中。
extension
扩展就是向一个已有的类、结构体或枚举类型添加新功能。
扩展可以对一个类型添加新的功能,但是不能重写已有的功能。
Swift 中的扩展可以:
- 添加计算型属性和计算型静态属性
- 定义实例方法和类型方法
- 提供新的构造器
- 定义下标
- 定义和使用新的嵌套类型
- 使一个已有类型符合某个协议
extension XCSourceTextRange {
var startLine: Int {
return start.line
}
var endLine: Int {
return end.line - (end.column == 0 ? 1 : 0)
}
}
复制代码
String的range函数
swift中还提供了另一种好用的正则方式,就是String的range函数,它可以传入正则和一些其他参数来验证该字符串是否符合正则
extension String {
func match(regular: String) -> Bool {
/**
*swift中还提供了另一种好用的正则方式,就是String的range函数,它可以传入正则和一些其他参数来验证该字符串是否符合正则
*/
return range(of: regular, options: .regularExpression) != nil
}
}
复制代码
参考:
30天学习编写30个Swift小程序------nimoming
自学 iOS - 三十天三十个 Swift 项目 ------Allen_朝辉