swift - 30天坚持学习打卡

·  阅读 161

关注我的小伙伴们和看过我之前文章的小伙伴们,一定知道,之前我写过几篇swift基础知识的文章,当时也是自己想要系统的从基础知识开始学习一下swift。但是没有坚持下来,很尴尬。。。大概是因为我懒,就不为自己找别的理由了。

最近偶然在掘金社区里有看到大佬们分享的swift学习的经历和资料,真是很佩服他们的学习能力和毅力以及分享的精神。所以我也打算再把放了很久的swift再重新拾起来,跟着大佬们的步伐继续学习。

可能看到这篇文章的你,也和我有过同样的困扰,时刻告诉自己,作为一名iOS开发者,swift已经是必须要具备的能力了,但是工作中用不到,公司项目还是OC,没有实践的机会,就觉得学了不用很快就会遗忘。那么如果你看到这篇文章,希望你也可以和我一样下定决心,继续一起学习swift,我也是从入门开始,我们一起互相监督鼓励。学习的路上真的需要几个志同道合的朋友。

本文会不定期(我尽量定期一直)更新,看到文章的同学我们一起开始swift的学习吧。我自己写的代码都会上传到GitHub供大家参考,如果发现有不对的地方,欢迎随时指出。

00 day

在学习的最开始,建议大家可以去看看我之前写的关于swift基础知识点的文章,再开始动手写swift。主要是为了熟悉一下语法,其实我们有比较深厚的OC功底,写swift上手应该比较快。

xcode12中把playground的新建放到了这里,如下图: run playGround 可以自己设置快捷键:

建议

  1. 主要看一下基础语法和数据类型
  2. 字符串、集合类型的操作
  3. 函数
  4. ...

01 day

一个简单计数器,每秒+0.1,有开始、暂停、复位功能。

知识点:

  1. 使用了故事板直接拖拽的控件
  2. Timer只是简单的创建和销毁
open class func scheduledTimer(timeInterval ti: TimeInterval, target aTarget: Any, selector aSelector: Selector, userInfo: Any?, repeats yesOrNo: Bool) -> Timer

open func invalidate()
复制代码
  1. 属性监视器
var count:Float = 0.0 {
//        属性观察
        didSet {
            secondShowLabel.text = String(format: "%.1f", count)
        }
        
        willSet {
            //属性值改变前 do something
        }
    }
复制代码

02 day

使用自定义字体

知识点

  1. 字体拖入工程中需要在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>
复制代码
  1. font的设置方法
self.textLabel.font = UIFont.systemFont(ofSize: 17)

textLabel.font = UIFont.init(name: self.fonts[fontIndex], size: 17)
复制代码

03 day

UITextView的简单使用

知识点

  1. UITextView的delegate使用,和OC 很类似
  2. 字符串的截取 func prefix(_ maxLength: Int) -> Substring

Substring这个类型感兴趣的可以深入去了解一下,比如下面的代码中,substr是和str共享了同一块内存,所以对substr的操作更加高效和快捷,而且SubstringString一样都实现了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的简单使用

知识点

  1. 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的基础使用

知识点

  1. 这个demo使用了storyboard,可以顺便复习一下故事板的使用和约束添加
  2. UICollectionViewdelegatedataSource由VC去实现
  3. 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写也完全没问题,就是拿来练练手的,代码也不算多,感兴趣可以看看

功能是匹配到代码中的十六进制色值,在该行代码后面备注色值对应的颜色。

知识点

  1. 正则匹配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
        
    }
复制代码
  1. 条件语句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_朝辉

分类:
iOS
标签:
分类:
iOS
标签:
收藏成功!
已添加到「」, 点击更改