苹果最近宣布了一个改变iOS应用既往开发的一个大变化,一种取代Objective-C称为Swift的完全不同的编程语言。我正在努力学习这门新语言,而且我决定将按照我的学习进程定期发布并共享我所找到的内容。这是众多主题的第一篇文章,我希望你能跟随下去!
下面的Swift代码例子今后有极大的可能会改变。这主要是因为我开发风格是先写代码来测试理念,然后再重构,这主要是因为我(也可能是大家)对Swift完全是新手且正在学习。因此正如我过去学东西一样,随着时间的推移本教程也会随之改变。我会根据需要更新的示例代码,但没有学习过程时这么多,验证代码也是如此。我觉得这样也是个有帮助的过程。
所以我要从一个非常基本的应用开始,来解释代码如何工作。准备好了吗?让我们开始吧。
基础
Swift没有遵从标准的变量声明模式——将变量类型放在变量名前,而是选择类似JavaScript的‘var’关键字来定义所有变量。
比如你在Objective-C中这样实例化:
NSString *myString = @"This is my string.";
你现在需要这样:
var myString = "This is my string."
同时常数使用 ‘let’关键字来设定
let kSomeConstant = 40
在这种情况下kSomeConstant被隐式地定义为一个整数。如果你想更详细也可以指定类型,像这样:
对于数组和字典,使用方括号[]来描述
var colorsArray = ["Blue", "Red", "Green", "Yellow"]
var colorsDictionary = ["PrimaryColor":"Green", "SecondaryColor":"Red"]
其他还有很多,但是我认为这些基础对作为教程的开始很重要。下面,让我们开始“Hello World”。
Hello World
首先,我们会写一个最简单的起步应用,Hello World。
这个应用只做了一件事:在控制台上打印出"Hello World"。你想要跟上技术前进的潮流的话,就需要下载XCode,这要求你有一个开发者账号。如果你已经有了开发者账号,那么就请前往http://devloper.apple.com ,获取XCode。
至此,你已经建立好了集成开发环境。现在就可以向控制台打印hello world了。这个例子不仅仅向你展示了可以完成构建的最简单的应用,同时更为重要的是证明了你已经正确地建立了开发环境。
使用单一视图应用模板建立Xcod项目,然后确定你选择使用Swift语言。在项目的目录树里,现在你应当能够看到文件AppDelegate.swift。 在这个文件里,你可以找到如下一行:
"// Override point for customization after application launch."使用下面神奇的hello world代码替代上面这行:
println("Hello World")然后,按Run,你将会看到一个空白的应用启动起来,接着在控制台上打印出词语"Hello World"。恭喜你,你已经用Swift编写出第一个应用!虽然这个应用不可以获得任何赞许,却可以让我们基于它进行更深入的探讨。
在这一小节了,我们将真正地给屏幕上放置一些素材,非常好玩!
请先在Xcode里打开Main.storyboard文件,然后从对象库拖动"Table View"对象。把这个对象放置在应用窗口里,并使它填满整个屏幕,然后确保表格视图与各个边对齐。此时如果你运行此应用,你将在模拟器里看到的是一个空的表格视图。
现在,我们需要给表格视图设置delegate和数据源。使用接口构建器做这些工作非常简单。只要一直选中表格视图,然后点击,并拖拉表格视图到storyboard文件列表里的"视图控制器“对象里。紧接着选择”数据源“即可。类似的可以设置"delegate"。
好了,现在我们就可以更深入的看看表格视图的通信协议的处理方法了。由于我们在视图控制器里使用了UITableViewDataSource和
UITableViewDelegate,所以我们需要按照如下方式修改类的定义。
打开ViewController.swift,修改如下行:
class ViewController:UIViewController {
为
class ViewController:UIViewcontroller,UITableViewDataSource,UITableViewDelegate{
在上面两个通信协议中的任何一个点击+号就会在最前端显示所有的函数。在当前的表格视图里,我们至少需要两个函数:
func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell!
现在,我们修改视图控制类,添加下面两个函数:
func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int { return 10 } func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! { let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "MyTestCell") cell.text = "Row #(indexPath.row)" cell.detailTextLabel.text = "Subtitle #(indexPath.row)" return cell }
第一个函数是获取表格所占用的行数,在这个例子里我们只是硬编码其为10,然而通常这个值是表格视图控制器数组的长度。现在例子里这么做纯粹为了简单。
第二个函数是发生变化的魔法所在。在这个函数里,我们创建了调用每个表格的UITableViewCell实例,而且标题风格为表格所带风格。
接着,我们给每个表格赋予文本串"Row#(indexPath.row)"。
在Swift里,就是这样在字符串中嵌入变量的。现在我们正在做的事情就是通过在字符串中嵌入(indexPath.row)来获取indexPaht.row的值,可以用表格的行数动态的替代这个值。这样就会产生下面结果:"Row #1","Row #2"等等。
这个详细文本标签之在子标题单元格中可用,就是我们在这使用的这个。我们把它设置为类似于“Subtitle #1″,“Subtitle #2″,等等。
继续往下来,运行你的应用,你将看到一个让人惊讶的单元格列表,它显示有标题、副标题以及行数。这是在iOS中显示数据最常用的方法,这必然会对你有所帮助。想看我视图控制器文件完整的源代码的话,看这里吧:ViewController.swif。
在第二部分中,我们将探讨一个应用,这个应用使用iTunes的搜索API来发现并显示iTunes商店里的专辑。
在第一部分中我们研究了一些Swift的基础,并搭建了一个简单的示例项目,创建了一个表视图并在其中放置了一些文本。如果你没读过,到这里读一下吧。
在本节中,我们要做一些更有抱负的事。我们将要接触到iTunes商店的搜索API,下载JSON结果,将它们解析为字典然后用这些信息填充我们的Table视图。然后,我们将为Table视图添加单击事件来添加一些用户交互,当点击一个项目后iTunes商店的相应项目将被打开。
这听起来好像工作量很大,别担心。这些都是iOS应用非常基本的功能,它也是每个开发者都要做的最普通的事情。那我们继续吧。
连接到UI
我们需做的第一件事是得到一个Table试图的引用,以便在在代码中使用它。继续往下走将下面这行添加到viewcontroller.swift文件中,放在类定义的下方,但要在任何函数之外。
@IBOutlet var appsTableView : UITableView
这段代码可以连接我们分镜头中的Table试图到“appsTableView”这个变量中。保存该文件并打开该分镜。现在,通过ctrl键+单机+拖动,将Table视图拖动到“View Controller”对象,这样便完成了这些对象的连接。容易吧?
现在我们已经实现了与UI的关联,下面就准备进行API调用。创建一个名为searchItunesFor(searchTerm:String)的函数。我们用它来实现对任意搜索词的网络请求。
为了保持这边文章简短,我将只发布结尾处的代码,并对部分注释进行说明。我们总是在说明部分提出几个问题,然后再做出进一步讨论,因此话题范围将非常广泛!
func searchItunesFor(searchTerm: String) { // iTunes API要求使用+分隔多个搜索词,因此在这儿用+号替代空格符 var itunesSearchTerm = searchTerm.stringByReplacingOccurrencesOfString(" ", withString: "+", options: NSStringCompareOptions.CaseInsensitiveSearch, range: nil) // 现在转义哪些无法识别出其是URL字符的其他字符 var escapedSearchTerm = itunesSearchTerm.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding) var urlPath = "https://itunes.apple.com/search?term=(escapedSearchTerm)&media=software" var url: NSURL = NSURL(string: urlPath) var request: NSURLRequest = NSURLRequest(URL: url) var connection: NSURLConnection = NSURLConnection(request: request, delegate: self, startImmediately: false) println("Search iTunes API at URL (url)") connection.start() }
我们逐行看看上面代码。
首先,我们需要对传入搜索词进行修正,搜索API要求搜索词的格式为"第一个搜索词+第二个搜索词+第三个搜索词+其他搜索词",而不是"第一个搜索词%20第二个搜索词%20第三个搜索词%20..."。因此,我们没有调用URL编码函数,而是调用了sringByReplacingOccurenesOfString的NSString方法。这个方法将返回搜索变量的修正版本,使用+号替代了其中的空格符。
接着,我们转义了搜索词中哪些无法识别为URL所包含的字符。
再接下来的两行定义了NSURL对象,这个对象将做为iOS网络API的URL参数。
以下两行非常关键:
var request: NSURLRequest = NSURLRequest(URL: url) var connection: NSURLConnection = NSURLConnection(request: request, delegate: self, startImmediately: false)
第一行使用我们前面创建的url变量作为URL参数来创建NSURLRequest对象。接着第二行创建了即将真正用来发送请求的“连接”。注意:我们设置参数中的delegate为该对象自身。这样我们就可以在视图控制器类的内部侦听连接发送来的响应信息。
最后,使用connection.start()发送请求。
现在我们已经有一个方法可以请求iTunes搜索结果了。这时,在viewDidLoad..的末尾处要插入下面这行:
searchItunesFor("JQ Software")
这样我们就可以在iTunes商店里查找哪些包含上面关键词的任何软件产品了,此时搜索的结果将包含几年前我所编写的两个游戏和几个较新的软件。当然,你也可以按照自己的意愿更换搜索字符串。
接下来,为了能够真正地接收到响应数据,我们需要跟踪包含返回结果的数据对象。首先,给当前类里增加一个成员:NSMutableData实例,即在类的定义插入下面一行,这行位于大括号之内。要能接收数据,我们还需要创建一个用来存储表格信息数组。
var data: NSMutableData = NSMutableData() var tableData: NSArray = NSArray()
接下来,我们一起看看NSURLConnection发送我们编写的类的函数,由于它是发送请求的代理,所以我们希望NSURLConnection发送的任何信息都能够通过在NSURLConnectionDeatDelegate和NSURLConnectionDelegate里定义的通信方法回送。如果你还不明白,请不要着急。接着向下看,你将很快明白这些是如何运行的。
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。 2KB翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。2KB项目(www.2kb.com,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务