首页 文章 精选 留言 我的

精选列表

搜索[磐石100],共10000篇文章
优秀的个人博客,低调大师

使用 Swift 构建一个 iOS 的邮件应用 【已翻译100%】

在前几个月内,我一直在做InboxKit的研究,它是关于Inbox平台的IOS SDK。Inbox为和邮件数据的交互提供高层API,使得你可以忽略IMAP,Exchange,MIME的解析以及thread探测(当然还有很多其他事情...),并使你致力于完成富有创意的APP的创作上。我们的目标很简单:尽可能地打造一个优雅的,跨提供商的邮件应用。毕竟,它很难。 在Objective-C中,InboxKit使得创建邮件体验变得很轻松,那么,Swift又如何呢?Swift在WWDC后已正式被IOS社区所采纳,我认为以后的SDK设计肯定会包括既有Objective-C又有Swift写的样例。 我们的第一个Swift例子,我想写一个简单的app,它就像一个魔幻8球:1.显示Inbox中未读thread 2.当你摇动手机,标记thread为已读并显示新的thread (译者注:文中的thread并不是线程的意思,在论坛中的一个帖子叫thread,回复叫post.这里可理解为一封邮件)**在 Swift 中使用 Objective-C SDK** InboxKit有6000行Objective-C代码,我们还不打算把他们都转换成Swift。为了编译我们的Swift邮件应用,我更新了open-source SDK,包含了“Xcode 6 自定义框架“。自定义框架是Xcode6的新特色-支持第三方框架的创建和分发。当DEFINES_MODULE标志设置为可用时,自定义框架会自动为Swift准备Objective-C模块的头文件。在Swift编译时,它会读取这个模块头文件,把Objective-C的类和方法映射到Swift。 Cocoa Touch框架包含这个SDK之后,在Swift中使用很简单。比如我创建了一个新的Swift应用,只需要把这个SDK拖入工程中,然后在root view controller中添加import InboxKit。 Xcode 6 自定义框架非常棒, 可是目前只有Xcode 6和iOS 8支持. 如果你正在开发一款应用程序, 你仍然可以选择pod InboxKit。 查看邮件InboxKit 让我们从Inbox同步引擎获取邮件数据变得简单起来。我们实例化一个 INThreadProvider ,以此展示来自我们邮箱账号的线程,并且具象化需要的数据。供应者模型 是InboxKit的一个核心概念: 他们被用于获取线程,信息,联系人和更多东西的集合 。供应者有点类似于Core Data中的 NSManagedObjectContext 和 YapDatabase的视图——他们把复杂的东西封装在内部,只是暴露出一个结果集,这个结果集是基于你提供的配置。 在InboxKit,供应者从本地SQLite store拉取缓存数据,同时,让对于Inbox API 的询问变得透明。 我们的应用将展示来自Inbox的未读线程,每次一个,所以我们这样定义线程供应者: var provider:INThreadProvider! = namespace?.newThreadProvider(); provider.itemFilterPredicate = NSComparisonPredicate(format: "ANY tagIDs = %@", INTagIDInbox) provider.itemSortDescriptors = [NSSortDescriptor(key: "lastMessageDate", ascending: false)] provider.delegate = self self.threadProvider = provider 由于我们已经创建了一个线程供应者,我们就可以使用它的条目数组来存放我们的视图. 供应者不会同步获取结果集, 所以我们需要实现INModelProviderDelegate协议并监听更新. 当新的线程通过以下方式被创建的时候,供应者会调用-providerDataChanged 方法,这些创建新线程的方式包括:1.从缓存从获取 2.通过API加载 3.(某个时间)通过网络数据包被推送到应用. 实现协议确保了我们的应用总是显示最新的数据. 还有其他一些代理方法,比如 providerDataAltered:它让基于UICollection或者UITableView创建邮箱用户界面变得更简单,同时可以使用各种插入删除动画效果.但是目前,我们继续看一些基础的东西. func refreshInterface() { var items = self.threadProvider!.items if items.count == 0 { // display empty state self.subjectLabel.text = "No unread threads!" self.snippetLabel.text = "" self.participantsLabel.text = "" self.dateLabel.text = "" } if let thread = items[0] as? INThread { // display the thread self.subjectLabel.text = thread.subject self.snippetLabel.text = thread.snippet self.dateLabel.text = formatter.stringFromDate(thread.lastMessageDate); .... }}func providerDataChanged(provider: INModelProvider!) { self.refreshInterface()}func provider(provider: INModelProvider!, dataFetchFailed error: NSError!) { self.displayError(error);} 标记为已读在我们的 swift 示例程序中,我们要在用户摇动手机的时候,把当前线程标记为已读,并且显示一个新的线程。用InboxKit,标记为已读是非常简单的。 override func motionEnded(motion: UIEventSubtype, withEvent event: UIEvent!) { if (motion == UIEventSubtype.MotionShake) { var items = self.threadProvider!.items if let thread = items[0] as? INThread { thread.markAsRead() } }} 在后台,-markAsReadqueues这个方法使新的API动作进入队列,通过这种行为来从线程中移除未读标签。 INThread对象和本地存储的数据会被立刻更新,但是这个动作将会在手机上排队,直到可以建立连接。如果服务器拒绝这次的动作,那么本地的数据也会回滚。 我们不需要刷新我们的线程供应者-我们的工作已经完成!如果当前线程被标记为已读,那么它就不再需要满足我们线程供应者结果集的标准.供应者会自动匹配它的内容,并且调用providerDataChanged方法,我们实现的代理方法将会刷新我们显示,来展现新集合中的第一个线程。 接下来的步骤 好了! 只用了几十行代码,我们就创建了一个示例程序,它可以从我们的收件箱一条条的获取线程,并且让我们标记为已读.现在它仅仅需要点动画和润色.你可以从这里查看demo的源码:: SwiftEightBall Sample App 我们仅仅接触了InboxKit的一些浅显的东西.在IOS SDK的上层创建我们的swift应用,这意味着我们需要为模型获取本地类的支持,比如线程和通讯录,以及因为支持延时线程和消息动作的SQLite而变得更强大的离线缓存.看看iOS SDK documentation 学习一下更多关于在邮件上层创建美观大方应用的知识.

优秀的个人博客,低调大师

Swift 在对 Objective-C 改进的 6 个方面 【已翻译100%】

在 Atomic Object 的安娜堡办公室,我们做了一个观看2014年的WWDC主题演讲,毫不夸张地说,当Swift宣布的时候,我们感到十分激动。Swift,苹果正在推进的一个更现代的编程语言。我很高兴能获得先机并开始用它开发。 在这篇博文中,我将重点介绍Swift的几个语言特性,这将使开发者的工作更加轻松。 Objective-C语言的问题 当一个开发者申请一个关于Atomic Object的新职位时,我们会给他填写一个(GTKY) Getting To Know You的表。这个表要求填写一些常见的问题,包括技术和其他方面,比如你最喜欢的语言是什么,你会做些什么来改进它?很多开发者的回答不能令人满意,即使开发人员选择objective-C作为他们最喜爱的语言时,也想不出如何改进它!这个回答产生了大量的讨论,让我想起一个Objective-C的问题。仅举几例: 弱类型 - 通常处理id或class,并且需要可怕的C static casts 。 欠佳的枚举语法 - for in已经很好了,但我经常想到一个更好的索引。 缺少操作符重载的类,例如NSNumber的。 所以,我很高兴苹果宣布swift并公开了其语言细节。在这里我会谈一些对Objective-C语言的批评。我强烈建议开发人员下载Swift的书,看一看在Xcode 6的测试版。 激动人心的Swift特性1. 类型推断对我来说这个很有用。无比烦恼的是你不得不将id类型的实例非安全的转化为实际类型,这很容易出错并且向一个实际对象并不相应的id发送信号。总是检查respondsToSelector太乏味了。Swift给我们提供了一个解决方案---var关键字: 1> var anInt = 0 anInt: Int = 0 2> var aDouble = 0.0 aDouble: Double = 0 3> var anotherDouble: Double = 0 anotherDouble: Double = 0 4> var aString = "some string" aString: String = "some string" 注意:就像anotherDouble那种情况,你也可以显示的设置类型。可以用var同样的方式使用let来推断常量的类型。 2. 改进枚举语法 Objective-C有不错的集合枚举语法:**for (SomeType someObject in array) NSLog(@"%@", someObject.whatever);** 这是个不错的语法糖,但是问题是现实编程中,我通常需要一个和集合中元素实例一起的索引变量。. Swift 给了我们许多有用的集合枚举器, 但是尤其令人高兴的是他们提供了一个全局的enumerate()方法,可以用来返回一个包含了数组中元素和索引的元组。 19> array $R2: String[] = size=4 { [0] = "one" [1] = "two" [2] = "three" [3] = "four" } 20> for (index, value) in enumerate(array) { 21. println("Item \(index): \(value)") 22. } Item 0: one Item 1: two Item 2: three Item 3: four 23> 3. Override关键字当在类中声明一个实例函数时,如果他们覆盖了一个基类函数,他们必须标记为override的。如果没有这么做则会得到一个编译时错误。类似的,如果一个标记为override的函数没有覆盖基类的相应函数,同样得到一个编译错误。这一行为将的类更加的清晰和降低运行时崩溃的可能性。 4. 多返回值在我加入Atomic之前的那份工作中,我主要开发C++,并且经常发现自己写一些输出多值的方法。我总是为决定使用引用,pair还是将返回值包装为struct或class来作为参数传递而挣扎不已。 在Swift中,有内置的机制来用一个由任意数量的带标记的数据成员的组成的元组作为多返回值。 46> func calculateStatisticsFromArray(data: Double[]) -> (mean: Double, median: Double, mode: Double) { 47. return (62, 44, 12) 48. } 49> var stats = calculateStatisticsFromArray([]) stats: (mean: Double, median: Double, mode: Double) = { mean = 62 median = 44 mode = 12 } 50> stats.mean $R10: Double = 62 51> stats.median $R11: Double = 44 52> stats.mode $R12: Double = 12 Swift同样支持声明多个变量来显示的获取多返回值: <51> var(mean, median, mode) = calculateStatisticsFromArray(data)** willSet, didSet**在 Swift中, 类具有属性(类似于Objective-C)。有一个声明setter和getter的机制,如果属性的类型是简单的并且需要计算的,但是你想观察他们的变化,两个内置的需要覆盖的方法-willSet和didSet将会有帮助。 1> class Container { 2. var someValue: Double = 0.0 { 3. willSet { 4. println("willSet! \(newValue)") 5. } 6. didSet { 7. println("didSet! \(someValue)") 8. } 9. } 10. } 11> var c = Container() c: Container = { someValue = 0 } 12> c.someValue = 100.0 willSet! 100.0 didSet! 100.0 6. REPL REPL表示“read-evaluate-print-loop”,我认为它是通过沙箱测试输出的代码.您可以输入代码到REPL,如果您在使用一个IDE或者喜爱的文本编辑器,它会被编译/解释和实时运行,并马上能让你看到输出结果。这是开发人员努力学习这门新语言时能看到的一个强大功能。我一直在使用它来学习swift。 使用SWIFT REPL: 1.下载Xcode 6 Beta版。 2.在终端中运行以下命令来切换路径xcrun: sudo xcode-select -switch /Applications/Xcode6-Beta.app/Contents/Developer. 注意:如果要重置,请在使用终端里键入 xcode-select -r 3.xcrun swift 谁将拥有未来?我坚信,在iOS 8和以后的版本中,Swift将成长成为iOS开发的主流语言。尽管如此,苹果已经向我们保证,在运行时将保持二者兼容:我们的Objective-C应用程序仍然可以继续工作。同样清楚的是Swift的语法和语义将改变后的iOS 8。苹果告诉我们,他们不能保证源代码的兼容性,但会提供代码转换器。使用代码转换器的想法让我害怕了一下,我认为迁移到Swift的时间会来得早(iOS的8-9的样子),而不是以后。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册