2016-10-12 23:19:44 aa31140105 阅读数 4780
  • Swift 2.1 基础实操高清视频教程

    我们通过一些代码片段学习Swift中的constant和variable、各种基本types和tuple以及Swift中重要的语言特性之一: type inference。并录制了泊学高清视频,同步搭配了泊阅文档,为开发者朋友们的学习提供了一种全新的学习视觉享受。

    8445 人正在学习 去看看 崔轶

1.对用户的模型数据(自定义类:HCUserModel)进行归档和解档

1.1 需要遵循NSCoding协议

1.2 需要实现func encode(with aCoder: NSCoder){}归档方法

1.3需要实现 required init(coder aDecoder: NSCoder){}解档方法

1.4 重写init方法

2.HCUserModel的数据内容如下:

import UIKit


class HCUserModel: NSObject,NSCoding {

    

    var id:Int?

    var nickname:String?

    var phone:String?

    var account:String?

    var password:String?

    var type:Int?

    var icon:String?

    var attentionnumber:Int?

    var registertime:String?

    var qrcode:String?

    var signature:String?

    var dynamicstruts:Int?

    var score:Int?

    

    // MARK:- 处理需要归档的字段

    func encode(with aCoder:NSCoder) {

        

        aCoder.encode(id, forKey:"id")

        aCoder.encode(nickname, forKey:"nickname")

        aCoder.encode(phone, forKey:"phone")

        aCoder.encode(account, forKey:"account")

        aCoder.encode(password, forKey:"password")

        aCoder.encode(type, forKey:"type")

        aCoder.encode(icon, forKey:"icon")

        aCoder.encode(attentionnumber, forKey:"attentionnumber")

        aCoder.encode(registertime, forKey:"registertime")

        aCoder.encode(qrcode, forKey:"qrcode")

        aCoder.encode(signature, forKey:"signature")

        aCoder.encode(dynamicstruts, forKey:"dynamicstruts")

        aCoder.encode(score, forKey:"score")

    }

    

    // MARK:- 处理需要解档的字段

    requiredinit(coder aDecoder:NSCoder) {

        super.init()

        id = aDecoder.decodeObject(forKey:"id")as?Int

        nickname = aDecoder.decodeObject(forKey:"nickname")as?String

        phone = aDecoder.decodeObject(forKey:"phone")as?String

        account = aDecoder.decodeObject(forKey:"account")as?String

        password = aDecoder.decodeObject(forKey:"password")as?String

        type = aDecoder.decodeObject(forKey:"type")as?Int

        icon = aDecoder.decodeObject(forKey:"icon")as?String

        attentionnumber = aDecoder.decodeObject(forKey:"attentionnumber")as? Int

        registertime = aDecoder.decodeObject(forKey:"registertime")as?String

        qrcode = aDecoder.decodeObject(forKey:"qrcode")as?String

        signature = aDecoder.decodeObject(forKey:"signature")as?String

        dynamicstruts = aDecoder.decodeObject(forKey:"dynamicstruts")as? Int

        score = aDecoder.decodeObject(forKey:"score")as?Int

    }

    overrideinit() {

        super.init()

    }

}


3. 实现归档把模型保存到本地Document文件夹:
3.1 获取本地Document路径,一般路径都设为全局变量,方便解档直接使用:

let userAccountPath ="\(NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory,

FileManager.SearchPathDomainMask.userDomainMask,true).first!)/userAccount.data"


3.2 对获取到的模型进行归档操作,要注意模型必须是确定的类型,如果是可选类型会报发送未识别的消息的错误(切记)

NSKeyedArchiver.archiveRootObject(userModel!, toFile:userAccountPath)


4.实现解档从Document文件夹获取本地模型数据

4.1 判断Document文件夹下是否有已保存好的模型,有的话就解档取出模型

 if NSKeyedUnarchiver.unarchiveObject(withFile:userAccountPath) !=nil {

            

            userModel =NSKeyedUnarchiver.unarchiveObject(withFile:userAccountPath)as? HCUserModel

        }





2018-06-20 14:49:13 qq_37269542 阅读数 669
  • Swift 2.1 基础实操高清视频教程

    我们通过一些代码片段学习Swift中的constant和variable、各种基本types和tuple以及Swift中重要的语言特性之一: type inference。并录制了泊学高清视频,同步搭配了泊阅文档,为开发者朋友们的学习提供了一种全新的学习视觉享受。

    8445 人正在学习 去看看 崔轶

最近因为项目需求需要对项目代码进行升级,从之前的swift2.0版本升级到swift4.1版本。现将升级过程中遇到的一些语法变化与大家分享一下,希望会对大家有所帮助,

Swift 2.0 --> Swift 4.0

1.self.edgesForExtendedLayout = UIRectEdge.None  -->  self.edgesForExtendedLayout = UIRectEdge.init(rawValue: 0)

2.UINavigationBar.appearance().titleTextAttributes=NSDictionary(object:UIColor.whiteColor(), forKey:NSForegroundColorAttributeName) as? [String : AnyObject]  -->  UINavigationBar.appearance().titleTextAttributes = [NSAttributedStringKey.foregroundColor : UIColor.white]
[NSForegroundColorAttributeName: UIColor.white]  -->  [NSAttributedStringKey.foregroundColor : UIColor.white]

3.使用Alamofire获取statusCode: res.result.error?.code  -->  res.response?.statusCode

4.CGRectZero  -->  CGRect.zero

5.从其他线程回到主线程的方法:
   dispatch_async(dispatch_get_main_queue(), { () -> Void in 

   })		--> 

   DispatchQueue.main.async {

   }

 6.	UILabel获取字体大小的属性boundingRectWithSize的改变:
 	let size = body.boundingRectWithSize(CGSizeMake(CGFloat(w-20), CGFloat(10000.0)),options:NSStringDrawingOptions.UsesLineFragmentOrigin,  attributes: [NSFontAttributeName:UIFont.systemFontOfSize(12)],context:nil)     -->
 	let size = body.boundingRect(with: CGSize.init(width: CGFloat(Constants.SCREEN_W - 20), height: CGFloat(10000.0)),options:NSStringDrawingOptions.usesLineFragmentOrigin,  attributes:[NSAttributedStringKey.font : UIFont.systemFont(ofSize: 12)],context:nil)

 7.let myMutableString = NSMutableAttributedString(string: (!body.isEmpty ? body : "") , attributes: [NSFontAttributeName:UIFont(name: "HelveticaNeue", size: 12.0)!])	 -->  
   let myMutableString = NSMutableAttributedString.init(string: (!body.isEmpty ? body : ""), attributes: [NSAttributedStringKey.font : UIFont(name: "HelveticaNeue", size: 12.0)!])
 
 8.let paragraphStyle = NSMutableParagraphStyle()
 	myMutableString.addAttribute(NSParagraphStyleAttributeName, value: paragraphStyle,range: NSRange(location:0,length:myMutableString.length))   -->
 	myMutableString.addAttribute(NSAttributedStringKey.paragraphStyle, value: paragraphStyle, range: NSRange.init(location: 0, length: myMutableString.length))

 9.SDWebImage的用法改变:
   headImg.sd_setImageWithURL(NSURL(string: self.images[indexPath.row] as! String), placeholderImage: UIImage(named: "default_logo"))     -->   
   headImg.sd_setImage(with: NSURL.init(string: self.images[indexPath.row] as! String)! as URL, placeholderImage: UIImage(named: "default_logo"), options: .retryFailed, completed: nil)

10. UIApplication.sharedApplication().keyWindow?.windowLevel = UIWindowLevelStatusBar    -->   UIApplication.shared.keyWindow?.windowLevel = UIWindowLevelStatusBar

11. NSCalendarUnit.Day  -->   NSCalendar.Unit.day

12. var components = cal.components([NSCalendar.Unit.day, NSCalendar.Unit.month, NSCalendar.Unit.year, NSCalendar.Unit.weekOfYear, NSCalendar.Unit.hour, NSCalendar.Unit.minute, NSCalendar.Unit.second, NSCalendar.Unit.nanosecond], from: NSDate() as Date)
	components.setValue(components.month-3, forComponent: NSCalendar.Unit.month)  -->  components.setValue(components.month! - 3, for: .month)

13. formatter.stringFromDate(cal.dateFromComponents(components)!)  -->  formatter.string(from: cal.date(from: components)!)

14. string.characters.count  -->  string.count

15. string.stringByReplacingOccurrencesOfString(" ", withString: "")	-->	   string.replacingOccurrences(of: " ", with: "")

16. for i in str.characters {
	
	}         -->     
	for i in str {

	}

17. str.removeRange(index!)  -->   str.removeSubrange(index!)

18. let alertInputTelController = UIAlertController(title: title, message: "", preferredStyle: UIAlertControllerStyle.alert)
	alertInputTelController.addTextFieldWithConfigurationHandler {

	}	  -->   
	alertInputTelController.addTextField {

	}

19. addAttribute(NSForegroundColorAttributeName, value: UIColor.redColor(), range: NSRange.init(location: startIndex!, length: 1))   -->  
	attrString.addAttribute(.foregroundColor, value: UIColor.red, range: NSRange.init(location: startIndex!, length: 1))

20. tf.text?.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet()) != ""   --> 
	tf.text?.trimmingCharacters(in: NSCharacterSet.whitespaces) != ""     //检测textField中输入的字符去掉空格后是否为空的方法

21. kNewStoreInfo.setObject(tf.text!, forKey: key)   --> 
	kNewStoreInfo.setObject(tf.text!, forKey: key as NSCopying)

22. textView.text.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())    -->   
	textView.text.trimmingCharacters(in: NSCharacterSet.whitespacesAndNewlines)

23. //将内容同步写到文件中去(Caches文件夹下)
        let cachePath = NSFileManager.defaultManager().URLsForDirectory(NSSearchPathDirectory.DocumentDirectory, inDomains: .UserDomainMask)[0]
        let path = cachePath.URLByAppendingPathComponent("log.txt")
        appendText(path, string: "\(datestr) \(consoleStr)")     

        --> 

        let cachePath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
        let path = cachePath.appendingPathComponent("log.txt")
        appendText(fileURL: path as NSURL, string: "\(datestr) \(consoleStr)")

24. FileManager.defaultManager().createFileAtPath(fileURL.path!, contents: nil, attributes: nil)  -->  
	FileManager.default.createFile(atPath: fileURL.path!, contents: nil, attributes: nil)

25. NSFileHandle.init(forWritingAtPath: fileURL.path!)   -->
	FileHandle.init(forWritingAtPath: fileURL.path!)

26. //找到末尾位置并添加
    fileHandle!.seekToEndOfFile()        
    fileHandle?.writeData(stringToWrite.dataUsingEncoding(NSUTF8StringEncoding)!)  -->
    fileHandle?.write(stringToWrite.data(using: String.Encoding.utf8)!)

27. string.componentsSeparatedByString(",")  -->   string.components(separatedBy: ",")

28. NSIndexPath(forRow: i, inSection: 0)  -->   NSIndexPath(row: i, section: 0)

29. NSComparisonResult.OrderedAscending  -->  ComparisonResult.orderedAscending

30. NSNotificationCenter.defaultCenter().postNotificationName("Notification_UploadImage", object: j)  -->
	NotificationCenter.default.post(name: NSNotification.Name(rawValue: "Notification_UploadImage"), object: j)

31. NSNotificationCenter.defaultCenter().postNotificationName("Notification_UploadImage", object: "error", userInfo: nil)  -->
	NotificationCenter.default.post(name: NSNotification.Name(rawValue: "Notification_UploadImage"), object: "error", userInfo: nil)

32. let startIndex =  Int("\(range.startIndex)") -->
	let startIndex =  Int("\(range.upperBound.encodedOffset)") - 1

33. // 单例模式
    class var sharedInstance: TreeNodeHelper {
        struct Static {
            static var instance: TreeNodeHelper?
            static var token: dispatch_once_t = 0
        }
        dispatch_once(&Static.token) { // 该函数意味着代码仅会被运行一次,而且此运行是线程同步
            Static.instance = TreeNodeHelper()
        }
        return Static.instance!
    }
    -->  

    //由于dispatch_once在Swift4.0也已经被废弃   通过给DispatchQueue添加扩展实现
    extension DispatchQueue { 
    private static var _onceTracker = [String]()
    public class func once(token: String, block: () -> ()) {
        objc_sync_enter(self)
        defer {
            objc_sync_exit(self)
        }
        if _onceTracker.contains(token) {
            return
        }
        _onceTracker.append(token)
        block()
    }
    
    func async(block: @escaping ()->()) {
        self.async(execute: block)
    }
    
    func after(time: DispatchTime, block: @escaping ()->()) {
        self.asyncAfter(deadline: time, execute: block)
    }
}
// 单例模式
    class var sharedInstance: TreeNodeHelper {
        
        struct Static {
            static var instance: TreeNodeHelper?
            static let _onceToken = NSUUID().uuidString
        }
        //由于dispatch_once在Swift4.0也已经被废弃  此处通过给DispatchQueue添加扩展实现
        DispatchQueue.once(token: Static._onceToken) { // 该函数意味着代码仅会被运行一次,而且此运行是线程同步
           Static.instance = TreeNodeHelper()
        }
        return Static.instance!
    }

34. let url = NSURL(string:urlString.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!)  -->
	let url = NSURL(string: urlString.addingPercentEncoding(withAllowedCharacters: NSCharacterSet.urlQueryAllowed)!)

35. dispatch_async(DispatchQueue.global(0, 0), {
                    
    })    -->   
    DispatchQueue.global().async {

    }
 
36. 在Google Maps SDK中有三个常量来表示每种类型,此属性必须设置成其中一个. 这些常量是:
	kGMSTypeNormal
	kGMSTypeTerrain
	kGMSTypeHybrid
	在使用时候的变化:
 	kGMSTypeNormal  -->  GMSMapViewType.normal

 	kGMSMarkerAnimationPop --> GMSMarkerAnimation.pop

37. let directionsData = NSData(contentsOfURL: directionsURL! as URL)  -->
	let directionsData = NSData(contentsOf: directionsURL as URL)

38. 使用Alamofire解析获取返回的error code值方法:
	res.result.error?.code   -->   res.result.error?._code


2016-06-29 21:14:05 wj610671226 阅读数 9453
  • Swift 2.1 基础实操高清视频教程

    我们通过一些代码片段学习Swift中的constant和variable、各种基本types和tuple以及Swift中重要的语言特性之一: type inference。并录制了泊学高清视频,同步搭配了泊阅文档,为开发者朋友们的学习提供了一种全新的学习视觉享受。

    8445 人正在学习 去看看 崔轶

如何快速将Swift2.0的项目过渡到Swift3.0

      今年WWDC之后,相信大家都已经更新到iOS10和Xcode8.0beta版本尝鲜了,其中包括SiriKit、新的语音识别框架SFSpeechRecognizer、通知框架(UserNotifications.framework、UserNotificationsUI.framework)等等都等待着我们去探索和发现呢!大笑

        我个人认为最先接触的必然是Swift3.0语法的变化了,想当初我们手把手用Swift2.0撸出的项目,后续必然会过渡到Swift3.0中,难道我们又要一行一行的去修改代码吗?想想就不开心大哭,下面介绍较快的方法吧项目过渡到Swift3.0中。

准备好Xcode8.0Beta,将我们之前的项目用Xcode8.0打开。打开之后Xcode会有一个提示下面我们跟着截图一起走吧。

1、这个提示是说:你的项目包含早期版本的Swift代码,询问你是否更新到Swift3


2、点击next

3、选择Swift3


4、这里选择我们需要更新代码的Targets


5、耐心等待


6、点击Save保存


在上面这张图中我们便可以清楚的看到Swift语法的变化,左边是最新的语法,右边是之前的语法版本

当然通过上面的操作只能把绝大部分的语法修改过来,但是有一些部分的代码需要我们根据自己的实际情况去修改它才能完全过渡到Swift3中。

比如:1、类似i++这样的代码需要手动修改为i += 1

   2、第三方的OC库,调用也可能发生一点点的改变,手动修改(高德地图)

   3、使用了C语言风格的for循环也需要自己修改

   ......自己去探索吧小伙伴大笑

总结Swift3中语法详细的变化参考文章:https://gold.xitu.io/entry/576bd4595bbb500059463426

一篇讲解Swift3.0变化的英文网站(个人感觉很不错):https://www.raywenderlich.com/135655/whats-new-swift-3

补:总结Swift语法变化的好文章 http://tech.glowing.com/cn/swift3/

适配 Swift 3 的一点小经验和坑:https://imtx.me/archives/2064.html




2017-10-18 18:23:24 bddzzw 阅读数 10274
  • Swift 2.1 基础实操高清视频教程

    我们通过一些代码片段学习Swift中的constant和variable、各种基本types和tuple以及Swift中重要的语言特性之一: type inference。并录制了泊学高清视频,同步搭配了泊阅文档,为开发者朋友们的学习提供了一种全新的学习视觉享受。

    8445 人正在学习 去看看 崔轶
/*
Swift 中的闭包有很多优化的地方
1 根据上下文推断参数和返回值的类型
2 从单行表达式闭包中隐式返回 可以省略return
3 可以使用简化的参数如 $0 $1 意为从0或者1开始
4 提供了尾随闭包的语法
*/
//语法   parameters参数 return 隐藏了
//{(parameters) -> return type in
//    parameters
//}
//最简单的闭包//省略in的
let b = {
    print("这也是闭包")
}

//用变量记录函数 (带参数的闭包)
//带有参数的闭包
//参数返回值 实现代码  {形参->返回值 in 代码}
//带参数待返回值的闭包
let countNum = {(num1:Int,num2:Int)->Int in
    return num1+num2;
}
let count1 = countNum(2,3)


//闭包的应用场景

/*异步执行完成回调  控制器之间的回调  自定义视图的回调*/

/*  以下代码需要在项目中的.Swift文件中完成
override func viewDidLoad() {
super.viewDidLoad()
loadData { (result) in
print("获取json信息\(result)")
}
// Do any additional setup after loading the view, typically from a nib.
}
func loadData(completion: @escaping (_ result: [String])->()) -> () {
DispatchQueue.global().async {
print("耗时操作\(Thread.current)")
Thread.sleep(forTimeInterval: 1.0);
let json=["12","23","34"]
DispatchQueue.main.async(execute: {
print("主线程\(Thread.current)")
completion(json)
})
}
}
结果为:耗时操作<NSThread: 0x600000277000>{number = 3, name = (null)}
主线程<NSThread: 0x604000075a80>{number = 1, name = main}
获取json信息["12", "23", "34"]
*/

//闭包表达式
let names = ["s","b","e","h","f"]

func backwards(a1:String,a2:String)->Bool{
    return a1<a2;
}
// public func sorted(by areInIncreasingOrder: (Element, Element) throws -> Bool) rethrows -> [Element]
var result = names.sorted(by:backwards)
print(result)

//参数名缩写
///以上代码还可以  Swift自动内联函数提供了参数名称缩写功能,您可以直接通过$0,$1,$2来顺序调用闭包的参数。
var result1 = names.sorted(by:{$0<$1})
print(result1)

//作为一个函数接受两个String类型的参数并返回Bool类型的值Swift可以自动推断出您想使用大于号的字符串函数实现:
//运算符函数
var result2 = names.sorted(by:<)
print(result2)

//尾随闭包
//例子1  尾随闭包是一个书写在函数括号之后的闭包表达式,函数支持将其作为最后一个参数调用。

var result3 = names.sorted(){$0<$1}
print(result3)



//例子2
//此时点回车函数会变成中括号的形式 也就是说如果函数的最后一个参数是闭包,函数的参数可以提前结束
//        最后一个参数直接使用{}来包装闭包的代码
//        loadData1(completion: <#T##([String]) -> ()#>)
//以下两段代码相同只不过一个是使用尾随闭包的写法
/*func loadData(completion:@escaping (_ result:([String])->())->()){
    DispatchQueue.global().async {
        print("耗时操作\(Thread.current)")
        Thread.sleep(forTimeInterval: 1.0);
        let json=["12","23","34"]
        //以下两段代码相同只不过一个是使用尾随闭包的写法
        DispatchQueue.main.async{
            print("主线程\(Thread.current)")
            completion(json)
        }
        DispatchQueue.main.async(execute: {
            print("主线程\(Thread.current)")
            completion(json)
        })
        
    }
}
*/


良言一句三冬暖,恶语伤人六月寒。无论工作还是生活,都不要拿脾气当做与他人博弈的武器。即使侥幸一时赢了,最终也只是两败俱伤。一言一语间,完成的是沟通,体现的是修养。或许我们不能成为优秀的别人,却完全可以做更好的自己。
2017-12-25 14:26:42 fzhlee 阅读数 2408
  • Swift 2.1 基础实操高清视频教程

    我们通过一些代码片段学习Swift中的constant和variable、各种基本types和tuple以及Swift中重要的语言特性之一: type inference。并录制了泊学高清视频,同步搭配了泊阅文档,为开发者朋友们的学习提供了一种全新的学习视觉享受。

    8445 人正在学习 去看看 崔轶

免费下载地址:https://itunes.apple.com/cn/app/id1320746678

◈ 不看视频不看书,手把手带您学习Swift语言
◈ 利用手指来互动式学习Swift 4.0
◈ 无痛上手,比观看视频、阅读书籍更加有趣、更加有效的学习方式 
◈ 变被动学习为主动学习,真正的Swift语言一点通,是您学习Swift语言的最佳方式


【Swift4互动教程是什么】
Swift4互动教程是一款简单、有趣、互动式的学习Swift的新工具。是第一款互动式学习Swift的工具。此应用将向您展示基于Swift 4.0的绝大部分功能点。
就像有一名专业的教师手把手地教您最新、最实用的Swift编程技巧。您将学会怎么使用Xcode来快速、直接地表达您的想法与创意。
另外,本应用119节课都包含互动模式,同时也支持观赏模式,当您在互动式学习中肢体疲劳时,可以切换至此模式,这样意味着您同时也拥有了119节教学影片。 

【Swift4互动教程主要包括哪些内容】
包含常量与变量、基本数据类型,以及Swift语言中的新数据类型—元组型和可选型的内容。同时还讲解了运算符和表达式、流程控制语句、字符和字符串、集合类型、函数和闭包。此外,Swift面向对象的枚举、结构体、类,以及内存管理、协议与抽象类型、错误处理、链式编程、iOS开发中的常见概念等内容也有所涉及。在第八章我们使用Swift语言实现了栈、队列、二叉树等数据结构,还实现了常见的8种排序算法。最后一章则包含了证书的创建、项目的架构、开发、打包、上传和发布一整套流程,供您学以致用。 部分内容如下:
- 使用Playground学习Swift
- Swift语言中的常量和变量
- Swift的标识符和关键字
- Swift的表达式Expressions
- 给Swift代码添加注释语句
- Swift的几个打印输出语句
- 在控制台输出类的实例及其属性

- Swift的(Boolean)布尔类型
- Swift的(Int)整形类型
- Swift的(Float)和(Double)浮点类型
- 字符串(String)及对字符(Characters)的遍历
- Swift字符串的使用详解
- Swift中的元组(Tuples)
- 基本数据类型之间的互相转换
- 一维数组(Array)的使用详解
- 多维数组的创建和遍历
- 数组的几种遍历方式
- 字典(Dictionary)的使用详解

- Swift的一元、二元和三元运算符
- Swift的位运算符和防溢出运算符
- 比较运算符和区间运算符
- 使用for-in循环遍历数组
- 使用循环语句获得序列中的最小值
- switch-case语句的实例解析
- continue、break和fallthrough的区别
- while和repeat-where循环语句
- if和if-let判断语句的使用解析

- 函数的参数和返回值
- 函数的外部参数名
- 创建拥有任意数量参数的函数
- 函数的输入输出inout参数解析
- 给函数的参数设置默认的取值
- 使用函数作为另一个函数的参数
- 函数类型的解析
- 使用函数类型作为函数的返回类型
- 函数可以拥有多个返回值
- 藏在函数内部的函数
- 递归函数的使用解析
- Swift那些非常实用的内部函数

- Swift的枚举(enum)类型及遍历
- 给枚举类型添加方法
- Swift的结构(struct)类型及其下标(subscript)
- 类(class)的初始化方法、属性和方法
- 类的引用(reference)特征
- 类和结构两个类型的比较
- 类属性的set和get方法解析
- 类属性的willSet和didSet方法解析
- 类析构方法(deinit)的使用
- 给类添加下标(subscript)
- 类的静态方法(class func)
- 将一个类的实例作为另一个类的属性
- 类的继承以及方法的重写(override)
- 父类在实例类型转化时的应用
- 使用is语句检查实例的类型
- 使用Any表示任意值类型

- 使用扩展(extension)扩展类型的属性
- 使用extension对方法进行扩展
- 使用协议(protocol)进行方法的声明
- 问号?和感叹号!的用法解析
- Swift中的闭包(Closure)详解
- Swift语言中的泛型编程
- Swift的do-try-catch错误处理模式
- 实例的引用特征和Swift的内存管理
- 实例的交叉引用和弱引用(weak)
- Swift的懒加载(lazy initialization)使用解析

- 范围Range、ClosedRange和NSRange的使用
- 点CGPoint和变形CGAffineTransform的使用
- 尺寸CGSize的使用详解
- 范围CGRect的使用详解
- 使用NSString对字符串进行各种操作
- 日期Date和DateFormatter日期的格式化
- 日历Calendar和日期组件DateComponents
- 日历Calendar和时区TimeZone
- 使用定时组件Timer执行定时任务
- 使用UserDefaults和归档方式存取用户数据
- 路径URL的使用详解
- 使用DispatchGroup管理线程组
- 使用UIScreen查询设备屏幕信息
- 使用UIColor设置界面组件的颜色属性

- Swift语言中的两种单例模式
- Swift语言中的三种消息传递模式
- 闭包在定时任务、动画和线程中的使用
- 通过protocol在两个对象中进行消息传递
- 通过间接代理进行对象间的消息传递
- 通过属性进行对象间的消息传递
- 使用通知的方法进行对象间的数据传递
- 使用performSegue在故事板页面之间进行数据传递
- Swift中的栈Stack和队列Queue详解
- Swift中的链表LinkedList详解
- 使用Swift创建一个二叉树BinaryTreeNode
- 冒泡排序算法的Swift实现
- 选择排序算法的Swift实现
- 快速排序算法的Swift实现
- 插入排序算法的Swift实现
- 希尔排序算法的Swift实现
- 归并排序算法的Swift实现
- 基数排序算法的Swift实现
- 堆排序算法的Swift实现

- 在iTunesConnect中创建产品ACTHelper
- 在Xcode9中创建新项目ACTHelper
- 创建开发证书和发布证书及其它文件
- 在ACTHelper项目中使用CocoaPod管理插件
- 创建BaseViewController作为控制器的基类
- 创建App的欢迎页面
- 登陆页面:创建自定义视图及相关组件
- 登陆页面:创建自定义表单Row以及基控制器
- 创建用户登陆页面
- 用户注册账号信息的输入和短信验证码
- 用户注册头像和科目信息输入页面
- 用户注册考试成绩输入页面及相关自定义组件
- 试题解析页面及相关自定义组件
- 试题科目列表及答案列表等自定义组件
- 创建试题解析列表页面和试卷选择页面
- 创建试题详情页面和浮动菜单组件
- 试题原文显示页面和数学公式的渲染
- 账号设置列表页面和分享、反馈、评分功能
- 会员个人信息设置页面和登出功能
- App发布前的设置以及打包、上传和提交审核
- 更多内容等待您的探索!!!










【相关互动教程】
Xcode9.0互动教程
https://itunes.apple.com/cn/app/id1063100471

iOS开发中的神兵利器
https://itunes.apple.com/cn/app/id1209739676

Excel2016互动教程
https://itunes.apple.com/cn/app/id1090726089

Photoshop CC互动教程精装版
https://itunes.apple.com/cn/app/id822431555

Illustrator CC互动教程
https://itunes.apple.com/cn/app/id1005557436

Photoshop CS5互动教程完全版:
https://itunes.apple.com/cn/app/id976566883

Photoshop脚本互动教程
https://itunes.apple.com/cn/app/id926846601
没有更多推荐了,返回首页