Swift Tutorial(swift 教程) 3:Arrays, Objects, and Classes数组,对象和类

本章节将会学习创建一个简单的命令行app,用来存储用户的名字和年龄。期间我们会学习到swift的一些新内容,比如数组,对象,类。

Note:  这一节将会教你开发一个命令行的 OS X app . 因此你需要再次确认你的Xcode版本是Xcode 6.1 及以上,否则无法进行。

Getting Started

打开xcode,点击 Get started with a playground :

name 设置为 Person, the platform 设置为 iOS, 点击 Next.保存 

输出自动创建的语句:

var str = "Hello, playground"

Classes and Objects类和对象

类是用于创建对象的蓝图,它是一个定义包括在特定类型的对象中的方法和变量的软件模板。

接下来我们会创建一个名为 Person.的类,并创建与这个类相关的方法和属性来服务于你的程序。 

首先在 playground:中加入声明类Person 的代码:

class Person  {
 
}

然后像创建变量一样,添加类的成员,比如姓,名子,年龄:

class Person  {
 
  var firstName = ""
  var lastName = ""
  var age = 0
 
}

除了上面定义的成员,还要添加成员函数,比如打印出用户的print方法。

首先,我们需要定义一个能够让用户输入信息的方法函数,将下面的代码拷贝复制到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"
  }
}

上面的方法是获取用户输入的信息.

Writing Your Own Method

下面我们将完成这个类的以下三个方法:

  1. changeFirstName() 允许用户修改姓
  2. enterInfo() 提示用户输入他们的信息内容
  3. printInfo() 将信息打印到终端

 changeFirstName()方法是获取一个值,将其设置为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
  }
 
}

Using Your Class

在playground 文件的最后面创建一个Person 类的对象newPerson ,如下:

var newPerson = Person()

给这个新对象的属性赋值:

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

点击窗口右边的眼睛图标,会显示 newPerson 对象中的属性值,如下图:


输入下面的代码,然后点击右边的眼睛图标,会发现之前firstName:存储的值已经变为 "Paul":

newPerson.changeFirstName("Paul")

More Methods

接下来将实现enterInfo().跟之前一样,先创建方法的头。在 changeFirstName() 方法的下面输入下面代码::

func enterInfo()  {
 
}

下面完成enterInfo()函数的主体内容。首先,利用println() 语句告诉用户你想让用户做什么

println("What is the first name?")

然后紧接着输入下面的语句,将用户从键盘输入的内容赋给对象的成员firstName.

firstName = input()

后面还会为该函数添加其他内容. 现在我们先创建 printInfo()方法:

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

目前为止,你已经完成了一个类的例子。建议尽可能的像上面一样在Playground中去编写代码,因为在制作一个完整的app之前,上面的方法非常适合熟悉swift的一些新语法。 

Creating a Class with a Swift File

打开Xcode ,点击  Create a new Xcode project . 如果你已经打开了一个工程项目,那就选择 File  目录里面的  New > Project .创建一个新工程。在 OS X 选项中选择  Application  和  Command Line Tool  ,然后点击  Next .
输入工程名称等信息之后,点击next保存。

然后进入  File\New\File  并选择  OS X\Source\Swift File  ,点击  Next .


命名为 Person.swift ,点击 Create.

将下面的代码拷贝到 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()  {
    println("What is the first name?")
    firstName = input()
  }
 
  func printInfo()  {
    println("First Name: \(firstName)")
  }
 
}

在转换到main.swift 文件之前,应该将 Person 类的内容完善。在enterInfo() 中添加名字和年龄的输入函数和提示信息。:

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

不要只是复制粘贴给出的代码,尽量自己一步步的去完成代码编写,如此才是学习。上面关于age的部分相对复杂一点,因为用户输入的age是字符串形式,我们需要通过toInt() 方法转换成整型。.

 printInfo() 方法中按下面的格式输出:

John Smith is 30 years old
Solution Inside: Solution Hide

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

   
 

全部代码如下

Solution Inside Hide

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()  {
    println("What is the first name?")
    firstName = input()
    println("What is \(firstName)'s last name?")
    lastName = input()
    println("How old is \(firstName) \(lastName)")
    let userInput = input().toInt()
    if let number = userInput {
      age = number
    }
  }
 
  func printInfo()  {
    println("\(firstName) \(lastName) is \(age) years old")
  }
 
}

   
 

Testing Your Class

打开 main.swift 文件输入下面的内容:

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

创建了类Person的一个新实例newPerson,类都使用构造器语法来生成新的实例。构造器语法的最简单形式是在结构体或者类的类型名称后跟随一对空括号,通过这种方式所创建的类或者结构体实例,其属性均会被初始化为默认值。

运行程序

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

The Do While Loop

接下来,我们利用do...while 循环实现用户能输入多个人的信息。首先,需要下载文件helpers.swift ,并加入到xcode中。前面章节已经结束了加入的方法。

 do...while 不同于 while ,因为do...while 在进行判断执行的条件之前就会先执行一次。

首先在 import 语句下面创建string类型的变量response:

var response: String

 do...while 循环以下面的代码开始:

do  {
 
}  while(response == "y")

将之前import下面的语句剪切后粘贴到循环里面。

另外,需要给用户提供选择是否继续进行循环操作。

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

用户输入y将会继续操作,输入n会退出循环。(然而,只要输入y以外的任何字符都会退出循环)

完整代码如下.

Solution Inside Hide

import Foundation
var response: String
 
do {
  var newPerson = Person()
  newPerson.enterInfo()
  newPerson.printInfo()
 
  println("Do you want to enter another name? (y/n)")
  response = input()
 
} while(response == "y")

   
 

运行并测试代码

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 response:String

创建一个名为people :的数组存储Person. 类型的对象。对声明的变量进行类型说明时,将类名字用[]括起来就表明你声明的是一个数组。赋值为[ ],表示该数组是空的,不包含任何内容。

var people: [Person] = []

To add an object to the array, you use the method采用 append(). 方法向数组中添加一个对象,将下面的代码插入到 enterInfo() 和  printInfo() 之间.

people.append(newPerson)

每创建一个 newPerson 对象 并为其输入相关信息后,都会通过append() 方法保存到数组中。 在循环的最外面我们可以通过 println() 打印出总共输入的人员信息个数.

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

运行app,并输入两个人员的信息,会看到如下打印:

Number of people in the database: 2

For Loops

下面我们学习使用 for 循环将整个数据库中的人员信息都打印出来,for-in循环能更简单地遍历数组(array)

在文件 main.swift:的最后面加上如下代码

for onePerson in people  {
 
}

for-in循环来遍历数组people里面的所有元素. 每轮循环执行完后,onePerson 的值就会变为数组中下一个对象,直到循环结束。将下面的语句加到for循环体中,每执行一次循环就会打印出数组中Person 对象的内容:

onePerson.printInfo()

main.swift:的完整代码如下.

Solution Inside Hide

import Foundation
var response: String
var people: [Person] = []
 
do {
  var newPerson = Person()
  newPerson.enterInfo()
  people.append(newPerson)
  newPerson.printInfo()
 
  println("Do you want to enter another name? (y/n)")
  response = input()
 
} while(response == "y")
 
println("Number of people in the database: \(people.count)")
 
for onePerson in people  {
  onePerson.printInfo()
}

   
 

运行app后,结果如下:




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值