自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Cwift的专栏

有勇气推倒柏林墙,激励更多iOS程序员走出舒适区

  • 博客(144)
  • 资源 (1)
  • 收藏
  • 关注

原创 最新文章请访问博主个人博客

我现在不在 CSDN 上写文章了,搭建了个人博客:phpswift.com

2017-08-10 14:07:31 665

原创 Swift 3.0封装 URLSession 的GET/SET方法代替 Alamofire

升级到 Swift3.0 之后,新版本的 Alamofire 只支持 iOS 9.0 以上的系统,如果要适配 iOS 8,需要自己封装 URLSession,下面是笔者的方案: 这里使用的是 Swift 自己的原生类型 URLSession,而不是NSURLSession。 Alamofire 4.0 中的request方法的参数列表如下:public func request( _ u

2016-10-10 12:18:25 8198 6

原创 关于“幽灵架构”的总结:适用场景与方法重载

前几篇博文对“幽灵架构”做了用法的介绍和相关技术点的补充,本文是一篇总结性质的文章,分析该架构的适用场景和限制,首先让我们回顾一下iOS开发的MVC模式,参考斯坦福公开课里Paul老爷子的讲解,如下图所示: 在MVC模式下Model和View是不能直接通信的,在“幽灵架构”体系中Model和View依旧不能直接通信,在传统的MVC中,这种通信的阻隔很多时候是因为在没有得到Model和View实

2016-05-13 12:02:40 6554 5

原创 关于“幽灵架构”的补充说明5:改造控制器

Swift中的泛型有非常多的用处,除了我在之前介绍的方法中作为占位符之外,还可以被用在协议中,构成一个泛型协议,那么遵守这个泛型协议的成员就会变成泛型成员。还用我们之前的事件节日提醒Demo来展示,在之前的版本中我们使用了一个TableView来展示数据,现在如果有新的需求,需要在CollectonView中做类似的排列,并且针对数据源提供日期的筛选功能,面对相似的功能需求显然你不想写两份代码,那么

2016-05-12 23:24:49 5600 1

原创 关于“幽灵架构”的补充说明4:协议的应用场景与局限性

再次解释一下协议的意义:定义某个功能模块的最小粒度,因为Swift是单继承,而无论是值类型还是引用类型都可以遵守多个协议,因此协议是比父类的粒度还要小的功能模块。协议的功能定义一定要具体并且严格,someObject:Protocol where …中where子句的匹配条件只能针对someObject的类型或者遵守的其他协议,以及Protocol中的associatedType的约束,也就是说不能

2016-05-12 10:45:45 5008

原创 关于“幽灵架构”的补充说明3:为什么不会产生“循环引用”

承接上文,已经简明阐述了使用Struct代替Class的好处,使用Class会使我们的程序出现“意外的共享”以及“循环引用”之类的危险,传统面向对象开发中对Class的依赖主要来自于我们对“继承”的依赖。Swift2.0引入协议扩展后,之前的“类-继承”所能实现的功能使用“结构体(枚举)-协议-协议扩展”都可以实现,并且更加高效和灵活。回到主题上来,首先回顾下“幽灵架构”中的两个主体:View和Mo

2016-05-11 23:57:20 4322

原创 关于“幽灵架构”的补充说明2:Struct以及Copy - on -Write

在“幽灵架构”Demo中我把两个数据模型声明成了Struct,苹果WWDC2015的414号视频讲解了非常多关于Struct的优势,其实也是所有值类型的优势。首先Swift标准库中绝大部分是值类型的,值类型的值传递是通过copy的,而作为一门静态语言,Swift要求所有的对象都有明确的类型,明确的类型代表了固定的内存分配,而414号视频也指出在内存中进行定长对象的copy是时间常数的,也就所谓的“c

2016-05-11 14:38:13 2312

原创 关于“幽灵架构”的补充说明1:协议中的方法定义

承接上一篇博文,上一篇的篇幅有点太长了,我觉得有一些相关的技术点需要说明,所以重新写几篇博文。这个系列的文章将要说明以下几个问题: 1.giveData和getData在各自协议中的位置 2.使用struct代替class的好处 3.“幽灵架构”为什么不会产生循环引用 4.协议的应用场景与局限性 5.运用面向协议编程思想改造控制器 让我们来简单回顾下这个架构,如果不明白的可以参考上一篇博

2016-05-10 23:37:45 7158

原创 Swift黑科技:还在争论MVC和MVVM?博主独创幽灵架构MV!

本人原创,长文慎入,但此文绝对不会让你失望。 WWDC2015已经过去一段时间了,我发现自从更新了Swift2.0到现在的Swift2.2,我只是跟着版本更新了所有需要更新的语法,依旧自以为是很熟练的Swift程序员。刚入职比较闲碰巧看到了1月份的中国首届Swift大会上大牛们的分享,突然陷入了思考,有了很多新想法又重温了几遍WWDC2015大会的视频,尤其是408和414号视频!!!我下定决心重

2016-04-11 00:54:07 12287 15

原创 写在新书《Swift开发手册:技巧与实战》出版之际

1月份的时候新书出版了,正值研究生毕业之际,想写点什么又无法抵抗毕业浮躁的心态,所以推到了正式入职之后。首先当然还是想安利一波,新书封面见如下: 2014年年底因为跟同学组队参加竞赛的关系,踏入了iOS这个全新的领域,在传统的OC和新晋的Swift之间,我选择了Swift,很幸运,现在看起来这门全新的语言发展的还不错。竞赛之后,因为兴趣使然我开始在CSDN上写博客,一边摸索一边分享

2016-03-04 00:06:22 2709 19

原创 Swift2编程之道:POP+MVVM

Swift2.0中引入了协议扩展的特性,并且建议开发者一切从协议(Protocol)出发,经过几个月的学习探索,博主发现Swift作为一门面向协议编程(POP)的语言非常适合时下火热的MVVM架构。MVVM已经提出有一段时间了,如果你还不懂什么是MVVM,建议先去补充相关的知识,再回到本文中。 在Cocoa Touch体系内,MVC是广为人知的经典架构,博主之前也讲解过MVC的相关知识,但是随着业

2016-03-01 00:38:54 2455

原创 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记47 文件系统Demo

本话将展示如何使用文件系统保存相机中保存的封面照片,使用一个提前准备好的封面设置Demo,在设置完imageView的image时候把新的图片保存到文件系统中。func imagePickerController(picker: UIImagePickerController!, didFinishPickingImage image: UIImage!, editingInfo: [NSObjec

2015-10-11 22:32:58 2032

原创 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记46 Persistence持久化

本话将介绍IOS中的四种数据持久化方式: Archiving SQLite File System Core Data 前面我们将结果NSUsrDefaults的用法,它是针对小数据量的持久化技术,本话的四种方式是针对大数据量的操作。 1.Archiving Archiving是一种把对象存储到硬盘上的存储方式,被存储的对象不需要所有属性的目录。只要一个对象实现了Archiving的两

2015-10-11 21:08:53 2043

原创 使用Swift去掉字符串中的空格

笔试面试时经常会出这样的问题:从某个字符串中删除多余的空格,因为英文是使用空格进行分词的,而URL中通常会包括非常多的特殊字符,所以这是一种很常用的做法。和OC中一样,在swift中也可以使用NSCharacterSet类来实现。对于字符串删空格操作,通常有两种情况: 1.删掉字符串首位的空格:var str = " Hello, play ground "let whitespa

2015-09-07 23:32:35 11422

原创 Swift实现的快速排序及sorted方法的对比

Swift语言有着优秀的函数式编程能力,面试的时候面试官都喜欢问我们快速排序,那么用Swift如何实现一个快速排序呢?首先扩展Array类:extension Array { var decompose : (head: T, tail: [T])? { return (count > 0) ? (self[0], Array(self[1..<count])) : nil

2015-09-07 22:28:55 8391 2

原创 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记45 Embed Segues

Embed segues是嵌入过渡,把一个MVC嵌入另一个MVC中,使用起来很简单。 只需要把需要嵌入的MVC放到另一个MVC上面即可,处理该segue的方法与其他segue没有区别,但是有一点是必须注意的,在prepareForSegue的时候,嵌入的MVC的outlet是没有初始化的,所以不要访问outlet的属性。 用法如下,拖入一个Container View,样式如下: 然后拖拽

2015-08-29 16:15:20 1464

原创 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记44 Popover Segue

在上一话中我们看了一个Demo,使用modal的方式,但其实如果要考虑到适配Iphone和Ipad设备的话,默认的modal会充满屏幕,而popover可以只占据屏幕上的一小块,之前我们讲过在Iphone中使用popover看起来和modal是一样的。实则不然,popover有很多设置在Iphone中也是生效的。修改上一话中的Demo。 首先为了突出效果我们把第一个场景的背景色加深,橙色好了,然后

2015-08-28 22:41:42 1499

原创 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记43 保护NSNotification的内存安全

在之前的Demo中讲解过NSNotification的用法,NSNotification是使用NSOperationQueue实现的,所以使用NSNotification不可避免地会陷入内存问题,比如下面这个情况:在storyboard中准备两个场景。在第一个场景中显示一个label,旁边有一个按钮我们可以点击这个按钮modal segue到另外一个场景中,在其中放置一个textField输入新的n

2015-08-28 12:11:14 1510 2

原创 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记42 Modal Segue(模态过渡)

modal segue会占据整个屏幕,所以使用的使用一定要小心,提前做好返回的处理,使用modal segue的好处是在执行某项操作前必须,比如我们熟悉的alert和actionsheet。 比如手机中的联系人页面,点击右上角的加号会出现一个添加联系人的页面,整个页面的划出方式就是modalsegue。通常modalsegue中的取消按钮会取消当前的操作,而确定按钮会提交当前的操作。注意modal

2015-08-27 15:50:04 1439

原创 使用@noescape解决Swift闭包“保留环”问题

在使用Swift进行编程的时候我们经常使用闭包,闭包虽然好,但是不可避免地会带来“保留环”问题,考虑下面的情况: 在某个动画框架中有一个loop函数: func loop(duration:NSTimeInterval,reverse:Bool,animations:()->Bool )在我们自己的类中定义一个动画方法,使用了这个函数:class MyView:UIView{ func an

2015-08-26 10:49:58 3611

原创 使用@autoclosure提高Swift代码质量

在Swift中方法终于成为了“一等公民”,可以作为参数被方法利用,在接触今天的内容之前,你必须了解Swift中方法和闭包的概念。Swift支持方法嵌套,Swift中的方法和闭包在类型上是有区别的。也就是说传入方法类型的参数也可以接收闭包,可是方法只能传入匹配方法返回值类型的参数,也就是说在运行方法前需要先执行参数中的方法算出返回值在传入参数运行调用该参数的方法,如果在一个方法中使用了多个判断语句可以

2015-08-26 09:51:31 2120

原创 使用Swift模拟Window-LFU

今天参加了阿里2015的校招的机试,大题开放题比较多,有一道大题是Window-LFU比较有意思,当时题目搞了半天没搞明白让干啥- -题目大概是这样的:实现一个Window-LFU缓存(其实就是用数组去缓存,当时差点用NSCache去做),要在API中暴露set、get、remove方法,并且可以指定cache的长度和window的大小。我用Swift实现的,当时做的时候时间比较紧没有做的太完整,

2015-08-23 16:44:02 1804 2

原创 IOS开发他山之石系列-安装Alcatraz

Alcatraz可以帮助我们扩展Xcode的功能,使用直接集成的方式来管理Xcode插件。 具体办法为: 1.打开终端 2.输入以下命令行:mkdir -p ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins;curl -L http://git.io/lOQWeA | tar xvz -C ~/Library/A

2015-08-05 23:36:04 1385

原创 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记41 Animation动画

IOS中的动画有以下几种: 第一种是为UIView的元素添加动画。 第二种是控制器的动画,比如之前介绍的导航控制器的用法。 第三种是Core Animation,这是一个很强大的框架,但是超出了这门课程的范围。 第四种是Dynamic Animation,这种动画基于设备的物理特性,比如晃动手机、调转方向等等。 本话来讲解第一种情况: 可以诸如frame、transform、和a

2015-07-26 22:58:11 1405

原创 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记40 NSTimer

NSTimer的主要作用是延时调用某个方法。 NSTimer主要使用在run loop中,而run loop是主队列中的东西,我们不介绍run loop ,但是读者需要知道NSTimer是用在主队列中的。 比如你在玩某个游戏,每一秒中要刷新游戏分数,就可以使用NSTimer。 使用如下方法来创建一个Timer,方法定义: 下面是使用的例子: 要关闭这个timer的时候只需要调用

2015-07-26 21:31:14 1238

原创 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记39 Alert&ActionSheet

Alert和ActionSheet是IOS中弹出消息的两个工具。 首先它们都是Modal的方式展示的。 Alert用来向用户发起询问,可以有一个(比如取消)或两个选项(比如确定和取消),也可以附带一个文本框(比如要求用户输入密码) Action Sheet从屏幕底部滑出,提供一些分支的选项,选项的数量可以大于两个。 对比如图: Action Sheet和Alert都可以使用UIAl

2015-07-26 20:35:44 1294

原创 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记38 Unwind Segue反向过渡

之前我们接触过了segue,这是IOS中最基本的传递方式,今天来讲解一下如何进行反向的segue。 反向过渡的使用前提是发出过渡的MVC必须是由目标MVC直接或者间接正向过渡来的。反向过渡是唯一不会创造新的MVC的过渡方式,它有下面两个适用场景: 1很适合在navigationController的栈中使用进行跳转。 2关闭一个使用modal Segue生成的MVC。 和其他的seg

2015-07-24 00:30:33 1795

原创 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记37 TableView Delegate

上一话介绍了tableView的datasource,本话来介绍另一个重要的部分delegate。 当我们点击一个cell的时候,如何跳转到另外一个mvc中呢? 像增加其他segue一样,点击cell按住control键,右键连线到另一个mvc上,然后松手,选择需要的segue类型。 如果你的cell上还有其他按钮,比如detail disclosure,你也可以选择它的segue:

2015-07-19 22:21:56 1397 2

原创 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记36 TableViewDatasource

TableView是iOS开发中非常重要的内容。 TableView的作用是在一张表格中展示数据,它是UISCrollView的子类,你会看到当table中的cell条目多的时候你可以通过上下滑动屏幕来获取更多的内容。 table可以是静态的也可以是动态的(比如一个table中item的数量)。 通过datasource和delegate可以创造出非常多样化的table样式。 在展示很大

2015-07-19 13:05:04 1346

原创 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记35 UITextField文本框

本话来介绍UIKit框架中的组件UITextField。  UItextField(文本框)和Label看起来看像,但是文本框是可以编辑的。在UI中使用文本框要注意,因为在模拟器上面输入文字是可以使用电脑键盘的,而在真机上,用户只能使用虚拟键盘,所以要注意。另外文本框中的文字大小、颜色等等也是可以设置的,就和在Label中一样。  每次我们点击文本框开始输入内容的时候,文本框会成为

2015-06-24 09:57:19 1288

原创 Swift语言IOS8开发战记27 Sketch初探

在之前我们新建了一个计算器项目,现在我想要给这个计算器项目制作一个桌面图标,可以使用Sketch,这是一款非常棒的软件。要想详细地学习这个软件请访问“Sketch中国”,里面有很多专业的Demo和教材。相对于PS这样的软件,Sketch简直就是为移动平台量身定做的。打开Sketch,然后在右侧选择新建一个DeskTop HD,主页面有点像我们的Xcode,中间是画布,右侧是检查器。可以

2015-06-19 16:33:56 1524

原创 Swift语言IOS8开发战记26 NSURLSession加载数据、上传下载

NSURLSession类支持三种类型的任务:加载数据、下载和上传,即Data Task,DownLoad Task和Upload Task。Session Task是整个NSURLSession架构的核心目标。Data Task用于加载数据,使用全局的sharedSession()和func dataTaskWithRequest方法创建,示例代码如下:import UIKitcla

2015-06-19 14:02:34 1730

原创 Swift语言IOS8开发战记25 网络通信Get和Post方式

Get是从服务器上获取数据,Post是向服务器传送数据。对于Get方式,服务器端用Requset.QueryString获取变量的值,对于Post方式,服务器端用Request.Form获取提交的数据。Get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内个个字段一一对应,在URL中可以看到。Post是通过HTTP Post机制,将表单内各个字段与其内容放置在HTML HE

2015-06-19 11:01:53 1700

原创 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记34 Info.plist、Capabilities

我们的工程中有一个Info.plist文件,之前我们做本地化设置的时候已经接触过这个文件了,里面可以做很多设置。你甚至可以以XML的格式来查看它,但是通常你编辑这个文件通过点击工程目录最顶端的工程名字的方法:你在你的应用中有很多特性,在你把它们设置为enable之前是不能使用的,开关的方式也很有意思,通过一个开关来表示是否可用,比如我们之前在做地图功能的时候使用了MapKi

2015-06-19 10:42:01 1699

原创 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记33 LifeCycle生命周期

IOS的生命周期如图所示:在APP开始运行时,进入绿色的部分,此时APP已经在运行了,但是UI还没有展示到屏幕上。然后你的控制器会被展示到屏幕上,在程序运行的大部分时间你都处于这个Active状态。当用户点击另一个APP的时候,当前的APP就可以移步到后台去了。在后台运行的时间非常的短,然后你的代码将停止运行,此时你的代码还没有被杀掉,在这个状态下什么都做不了,

2015-06-17 13:19:40 1507

原创 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记32 NSNotification

我们之前在讲解MVC模式的时候提到过,模型的改变是通过广播的形式,然后控制器将调到响应的频率接收到模型的消息,找出模型中的变化,这些变化其中之一就是NSNotification,它是MVC中处理电台的途径之一,实际是一种模型到控制器的通讯。还有一个类叫做NSNoticicationCenter,它有一个类方法叫做defaultCenter,它类似于共享消息中心,你只需要发送消息给它,然后指定你想听

2015-06-16 11:27:16 995

原创 swift语言IOS8开发战记24 解析Json

在IOS中使用NSURLConnection实现http通信,NSURLConnection提供了异步和同步两种通信方式,同步请求会造成进程阻塞,通常我们使用异步的方式,不管同步还是异步,建立通信的基本步骤都是一样的:1,创建NSURL2,创建Request对象3,创建NSURLConnection连接第3步结束后就建立了一个http连接。这里我们用一个开放的api做例子:

2015-06-15 14:54:54 1567

原创 swift 学习笔记之在柯里化(Currying)

有时候我们看到的方法中有很多组的参数,可能会让大家觉得疑惑,其实是因为这个方法使用了柯里化。Swift里可以对方法进行柯里化,也就说有多个参数的方法可以接受第一个参数,然后变成一个接受余下参数并且返回结果的新方法,举个例子:func twoTemp(a:Int)(b:Int) -> Int{return a + b}这个方法有两组参数,可以只传第一个参数:let oneTemp =

2015-06-14 11:04:58 1548 2

原创 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记31 Multithreading多线程

在IOS中存在着许多队列,和我们数据结构中的队列一样,这里的队列概念也是先进先出的。而每一个方法(包括闭包)都被组织在这些不同的队列中,而每一个队列都有自己的线程去运行这些队列,这就造就了多线程环境。其中有一个非常重要的队列叫做主队列,主队列是一个串行队列,所以主队列只会一个一个地执行主队列中的函数。所有的UI活动都必须发生在主队列中,所以当你想要一个函数或者是闭包的时候就会执行某些代码,这就

2015-06-10 19:40:11 1553

原创 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记30 ScrollView Demo实战

在上一话中我们创建了一个通过URL读取图片的Demo,这个Demo是不能拖动和缩放的,现在给它增加选项让它可以手动切换URL,并把图片添加到ScrollView中。向Storyboard中拖入一个splitviewController。把ImageViewController作为detail视图,把工程中自带的那个viewcontroller作为rootview,现在storyboard中的场

2015-06-05 10:55:20 1401

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除