为了账号安全,请及时绑定邮箱和手机立即绑定

【译】学习使用Swift编写iOS app教程3:数组,对象和类

标签:
iOS

写在前面:
刚刚开始学习Swift开发,很幸运的是在网上闲逛的时候看到了Ray Wenderlich的这些关于iOS开发的教程,写的非常详尽,还很有趣,不时会搭配一些很贱的小表情,非常对我的胃口:-)在此对其进行一些翻译,纰漏之处,欢迎大家指正。
——Schuming


Update note: This tutorial was updated for iOS 9 and Swift 2 by Brian Moakley. Original post by Mike Jaoudi and Ry Bristow.
恭喜,你已经学习到这个教程的第三部分了!
第一部分,你学习了Swift语言的基础.你学习了变量,if/else语句,循环,可选类型等等.
第二部分,你把新的Swift技巧应用到了制作一个猜数字游戏中.
在第三部分中,你将去创建一个简单地命令行app用来记录人得名字和年龄.
在这个过程中,你讲会学习到更多的Swift的概念,比如:数组(Arrays),对象(Objects),类(Classes).让我们开始吧!

注意:这教程的这个部分,你将会开发一个命令行OS X app,因为这是作为开始的最简单的方式.因此,你需要Xcode 6.1或者更新的版本来完成这个教程.在继续下去之前,请在此确认你的Xcode版本.


开始
打开Xcode并创建一个playground文件,点击Get started with a playground:
图片描述
将名字设置为Person,平台设置为iOS,点击Next.将playground保存到你所希望的路径下.删除这行代码,从空白区开始.

var str = "Hello, playground"

类和对象(Classes and Objects)
一个类(class)就像是一张描述对象(object)行为的设计稿.它决定了可以使用哪些方法来操作这个对象以及这个对象应该具备哪些特点.
在这个项目中,你将创建一个叫做Person的类.然后你要在这个类中创建一些方法并给与它一些属性,比如名字,年龄.以便于实现这个app的目的.
首先,在playground文件中添加类声明:

class Person  {
}

接下来,你需要给这个类添加一些属性(properties).属性(properties)是每个类的实例都拥有的变量.比如:每个人都有姓,名和年龄.
添加属性就像是创建变量,唯一的不同是需要将他们放到类声明中.在类中添加一些属性就像这样:

class Person  {

  var firstName = ""
  var lastName = ""
  var age = 0

}

除了属性之外,类还有方法(methods).方法是对于类的一些操作-比如,你可能想要添加一个方法把用户信息打印到屏幕上-实际上,你过会就要这么做了.
要事第一.这个app中,你需要一个问询用户信息的方法.将下面的代码复制黏贴到age属性后面.

func input() -> String {
  let keyboard = NSFileHandle.fileHandleWithStandardInput()
  let inputData = keyboard.availableData
  let rawString = NSString(data: inputData, encoding:NSUTF8StringEncoding)
  if let string = rawString {
    return string.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
  } else {
    return "Invalid input"
  }
}

这就是一个以字符串形式获取用户输入的方法.不要过多去考虑它是怎么工作的;在下个部分你将会学习到怎么去写一个自己的方法.


写自己的方法
在这个类中,你需要写三个方法:

  1. changeFirstName() 允许用户修改他们的名字
  2. enterInfo() 提示用户输入他们的信息
  3. printInfo() 将提示信息输出到控制台
    让我们从changeFirstName()开始,这个方法需要输入一个值,并把这个值付给Person的姓.
    首先你需要做的是写出方法的名称.在Person中,将下面的代码写在input()方法后面.
func changeFirstName(newFirstName:String)  {
}

很好!你迈出了写一个方法的第一步.现在你需要写出方法的内容.方法名后面的小括号中创建了一个String类型的变量newFirstName.你需要将Person对象的姓设置为newFirstName.实现方法的代码段应该是这样的:

firstName = newFirstName

你可以在方法中输入任何代码.这里只是一个简单地例子.
到了这里,你的文件内容应该是这样的:

import UIKit

class Person  {

  var firstName = ""
  var lastName = ""
  var age = 0

  func input() -> String {
    let keyboard = NSFileHandle.fileHandleWithStandardInput()
    let inputData = keyboard.availableData
    let rawString = NSString(data: inputData, encoding:NSUTF8StringEncoding)
    if let string = rawString {
      return string.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
    } else {
      return "Invalid input"
    }
  }

  func changeFirstName(newFirstName:String) {
    firstName = newFirstName
  }

}

现在,我们来试着用以下这个类.


使用你的类
为了创建一个类的实例,在playground文件的底部添加这行代码:

var newPerson = Person()

你刚刚创建了一个Person类型的对象newPerson,并将它赋值为一个初始化的Person对象.
现在试着给你的person类的属性赋值:

newPerson.firstName = "Ry"
newPerson.lastName = "Bristow"
newPerson.age = 18

如果你将鼠标移到右边靠近最下面一行的那个"眼睛"图标上,你会看见你已经更新了newPerson对象中的属性值.
图片描述
是不是很酷?你可以像这样使用你写的新方法:

newPerson.changeFirstName("Paul")

在窗口的右边,你应该看到和你的对象相关的值已经被改变为将“Paul”作为姓氏的值了.
这仅仅是使用类的基础-让我们再进一步.


更多的方法
既然你已经知道怎样写和使用一个方法了,然我们来开始写一个项目中将会用到的方法.第一个方法叫做enterInfo().就像之前一样,首先要创建方法的名称.在Person类的changeFirstName()方法下面写下这个方法名称

func enterInfo()  {

}

现在,然我们来写方法的内容吧.为了得到你希望用户所输入的内容,你要先告诉他们你所希望的内容.让我们使用print()语句:

print("What is the first name?")

这个语句应该放到方法的大括号中.这叫做函数体(method body).在这行后面,你要将input()的值赋予firstName.

firstName = input()

之后会在方法中添加更多的内容.现在,然我们继续完成printInfo().这个方法的目的是打印关于Person对象的信息.应该是这样的.

func printInfo()  {
  print("First Name: \(firstName)")
}

恭喜,你已经完成了类的雏形.像这样在Playground中完成一个雏形是很棒的,因为这是在创建一个完整的app之前去体验新事物的快捷易用的好办法.
这是目前为止,完整的Person.playground文件.
现在,让我们把它放到command line tool中!


通过Swift文件创建一个类
打开Xcode并点击Create a new Xcode project按键.如果你不小心关闭了 “Welcome to Xcode” 窗口或已经创建了Xcode项目, 你可以去File菜单中通过选择New > Project创建一个新项目. 然后在OS X 这部分选择Application,然后选择Command Line Tool并点击Next.
图片描述
在接下来的界面中,按照指示输入:

  • Product Name: PeopleDatabase
  • Organization Name: 这个部分可以为空,或者输入你的公司名.
  • Organization Identifier: 输入com.yourname, 比如com.bmoakley
  • Language: Swift
    图片描述
    现在,打开File\New\File 选择 OS X\Source\Swift文件模板, 点击Next.
    图片描述
    将文件命名为Person.swift,点击Create
    在Person.swift中,将你在Playground中写好的Person类拷贝过来.应该是这样:
import Foundation

class Person  {

  var firstName = ""
  var lastName = ""
  var age = 0

  func input() -> String {
    let keyboard = NSFileHandle.fileHandleWithStandardInput()
    let inputData = keyboard.availableData
    let rawString = NSString(data: inputData, encoding:NSUTF8StringEncoding)
    if let string = rawString {
      return string.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
    } else {
      return "Invalid input"
    }
  }

  func changeFirstName(newFirstName:String) {
    firstName = newFirstName
  }

  func enterInfo()  {
    print("What is the first name?")
    firstName = input()
  }

  func printInfo()  {
    print("First Name: \(firstName)")
  }

}

在你继续完成main.swift文件之前,你应该先完成Person类中的方法.需要做的是,在enterInfo()方法中为Person添加提示和输入名字与年龄的语句,以及在printInfo()方法中打印这两项信息.enterInfo()应该是这样:

func enterInfo()  {
  print("What is the first name?")
  firstName = input()
  print("What is \(firstName)'s last name?")
  lastName = input()
  print("How old is \(firstName) \(lastName)")
  let userInput = Int(input())
  if let number = userInput {
    age = number
  }
}

当代码提供给你时,确保你不是单纯的在拷贝黏贴.花点时间浏览代码并检验.这才是学习的途径.这部分代码针对每一个变量都有一个print()语句和一个input语句,但是对于年龄的那部分会更复杂一点.
由于年龄是Int型而非String型,它需要toInt()方法.如果这看起来很眼熟,那是因为你之前已经使用过了!记住,这个类型转换需要你使用if let语句,以防输入的值无法被转换为Int.
现在,你自己尝试着更新一下printInfo()的内容.试着得到这样的输出:

John Smith is 30 years old

如果感到困难,这里是答案:
答案:

func printInfo()  {
  print("\(firstName) \(lastName) is \(age) years old")
}

如果要检查一下你的作品,Person.swift的内容应该是这样的:

import Foundation

class Person  {

  var firstName = ""
  var lastName = ""
  var age = 0

  func input() -> String {
    let keyboard = NSFileHandle.fileHandleWithStandardInput()
    let inputData = keyboard.availableData
    let rawString = NSString(data: inputData, encoding:NSUTF8StringEncoding)
    if let string = rawString {
      return string.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
    } else {
      return "Invalid input"
    }
  }

  func changeFirstName(newFirstName:String) {
    firstName = newFirstName
  }

  func enterInfo()  {
    print("What is the first name?")
    firstName = input()
    print("What is \(firstName)'s last name?")
    lastName = input()
    print("How old is \(firstName) \(lastName)")
    let userInput = Int(input())
    if let number = userInput {
      age = number
    }
  }

  func printInfo()  {
    print("\(firstName) \(lastName) is \(age) years old")
  }

}

测试你的类
在Project Navigator中点击main.swift, 将内容替换为:

mport Foundation

var newPerson = Person()
newPerson.enterInfo()
newPerson.printInfo()

点击run来运行一下你的应用程序!

What is the first name?
Ry
What is Ry's last name?
Bristow
How old is Ry Bristow
18
Ry Bristow is 18 years old
Program ended with exit code: 0
恭喜你-你已经完成了你的第一个类!


重复while循环
下一部分,你将使用前一个教程中的helper函数,在这里下载.
helpers.swift拖曳到你的Xcode项目中,确保你选择了将对象拷贝到项目中(copy the items into the project.)
当你运行你的app时,能让用户输入多个person而非只能输入一个,是很好的做法.为了实现这个目的,让我们尝试来写一个新的循环.
这叫做repeat...while循环.repeat while循环以前叫做do while循环.他在Swift 2.0中被重命名了,为了避免和Swift的另一个特性产生冲突.
repeat whilewhile循环的不同之处是,repeat while在它检测条件是否满足继续运行之前,无论条件为何,都会先执行一次.
首先,在import语句下面创建一个叫做responsestring型变量

var response: String

在这下面,开始repeat...while循环:

repeat  {

}  while(response == "y")

然后,把它下面的代码全部剪切并黏贴到循环体中.
为了能让循环像用户希望的那样运行,你需要给出提示信息来问询用户,是否需要继续并将用户给出的回答赋值给response.在repeat...while循环的结束大括号之前输入下面的代码:

print("Do you want to enter another name? (y/n)")
response = input()

现在,用户会通过y(代表yes)或者n(代表no)来告诉程序是否需要继续下去(尽管从技术上来讲,除了y的一切输入都会让循环退出).
如果你对代码做一些检查,main.swift现在应该是这样的:

import Foundation
var response: String

repeat {
  var newPerson = Person()
  newPerson.enterInfo()
  newPerson.printInfo()

  print("Do you want to enter another name? (y/n)")
  response = input()

} while(response == "y")

在此通过run按键来测试你的程序.通过输入y来键入几个名字,然后通过输入n来退出.

What is the first name?
Ry
What is Ry's last name?
Bristow
How old is Ry Bristow
18
Ry Bristow is 18 years old
Do you want to enter another name? (y/n)
y
What is the first name?
Ray
What is Ray's last name?
Wenderlich
How old is Ray Wenderlich
34
Ray Wenderlich is 34 years old
Do you want to enter another name? (y/n)
n
Program ended with exit code: 0


数组(Arrays)
每一次你运行循环之后,程序就会将那些已经处理过的信息忘掉.数组可以将对象们保存在一个列表中,并让你获取到这些对象.在这行下面声明一个数组.

var response:String

输入:

var people: [Person] = []

你刚创建了一个存储了Person对象的叫做people的数组.通过将类名括在[]中, 你已经将它声明为数组.通过= [],你将它置为了一个不包含任何东西的空数组.
为了将对象添加到数组中,你要使用append()方法.让我们试一试.在循环中的enterInfo()和printInfo()函数中插入下面的代码:

people.append(newPerson)

现在,每次提示用户输入信息时所创建的newPerson对象,你将他们添加到数组中.为了完成项目,在循环外添加一些有用的print()函数.

print("Number of people in the database: \(people.count)")

通过查询people数组中对象的个数,第一行代码会让用户们知道他们向数据库中输入了多少个people.
再次运行你的app,输入两个名字.输入完成后,代码如下:

Number of people in the database: 2

For循环(For Loops)
最后来学习for循环.这个循环可以很轻松的完成对数组元素的遍历(iterate).如果你想要在最后输出真个people的数据库,这个方法非常管用!
让我们来试一下,在 main.swift底下加入这部分代码:

for onePerson in people  {

}

这个循环会按照每次访问一个对象的方式遍历people数组.每次循环结束后,下一个索引指向的对象会被赋值给onePerson,知道全部对象被遍历结束.
接下来把这行代码加入到循环体中:

onePerson.printInfo()

这行代码会在用户将所有信息输入完毕后,将people数组中的每一个Person对象的信息打印出来.
做得好!这里是main.swift的全部内容.如果你遇到了一些棘手的问题,可以看下这些代码来获取帮助:

import Foundation
var response: String
var people: [Person] = []

repeat {
  var newPerson = Person()
  newPerson.enterInfo()
  people.append(newPerson)
  newPerson.printInfo()

  print("Do you want to enter another name? (y/n)")
  response = input()

} while(response == "y")

print("Number of people in the database: \(people.count)")

for onePerson in people  {
  onePerson.printInfo()
}

你完成了-构建(build)并运行(run)最后的版本.在你运行了应用程序后,应该会看到下面的内容:
图片描述


接下来做些什么?
最终版本的源代码在这里.
你现在准备好学习教程系列的下一部分了,你将会学习怎么创建你的第一个iPhone app!
如果你有任何的问题或评论,可以在这个系列的论坛中讨论一下!


Schuming注:作者信息在下面:向一切有分享精神的人致敬!一鞠躬!二鞠躬 !三鞠躬!
while(1){ 鞠躬!鞠躬!鞠躬!}
图片描述
Brian Moakley
Brian is not only an iOS developer and fiction writer, he also holds
the honor being Razeware‘s first fulltime employee.

Brian joins Razeware with experience from companies such as ESPN’s
online fantasy team and Disney’s Internet Group. When not writing or
coding, Brian enjoys story driven first person shooters, reading some
great books, and he runs his own "Let's Play" channel on YouTube.

[Follow Brian Moakley on Twitter]

点击查看更多内容
2人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消