您的位置:首页 > 移动开发 > Swift

Swift之枚举类型&结构体

2016-05-04 10:33 381 查看

枚举类型

枚举类型的介绍

概念介绍

枚举定义了一个通用类型的一组相关的值,使你可以在你的代码中以一个安全的方式来使用这些值。

在 C/OC 语言中枚举指定相关名称为一组整型值

Swift 中的枚举更加灵活,不必给每一个枚举成员提供一个值.也可以提供一个值是字符串,一个字符,或是一个整型值或浮点值

枚举类型的语法

使用enum关键词并且把它们的整个定义放在一对大括号内

enum SomeEnumeration  {
// enumeration definition goes here
}

枚举类型的定义

以下是指南针四个方向的一个例子

case关键词表明新的一行成员值将被定义

不像 C 和 Objective-C 一样,Swift 的枚举成员在被创建时不会被赋予一个默认的整数值

在上面的CompassPoints例子中,North,South,East和West不是隐式的等于0,1,2和3

enum CompassPoint {
case North
case South
case East
case West
}


定义方式二:多个成员值可以出现在同一行上

enum Planet {
case Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune
}

给枚举类型赋值

枚举类型赋值可以是字符串/字符/整型/浮点型

注意如果有给枚举类型赋值,则必须在枚举类型后面明确说明具体的类型

1.枚举类型的赋值

// 1.枚举类型的赋值
enum CompassPoint : Int {
case North = 1
case South = 2
case East = 3
case West = 4
}
enum Planet {
case Mercury = 1, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune
}


2.枚举类型的使用

// 2.枚举类型的使用
let p = Planet(rawValue: 3)
if let p = p {
switch p {
case .Mercury:
print("Mercury")
case .Venus:
print("Venus")
case .Earth:
print("Mercury")
case .Mars:
print("Mars")
case .Jupiter:
print("Jupiter")
case .Saturn:
print("Saturn")
case .Uranus:
print("Uranus")
case .Neptune:
print("Neptune")
}
}

结构体

结构体的介绍

概念介绍

结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合

结构体(struct)指的是一种数据结构

结构体是值类型,在方法中传递时是值传递

结构的定义格式

结构的定义格式

struct 结构体名称 {
// 属性和方法
}

为什么需要结构体?

先来看一个例子

我们要计算平面坐标里某个点距点Center的距离是否小于200

算起来很简单,勾股定理就搞定了:





其中sqrt(n)用来计算n的平方根

pow(x, n)用来计算x的n次方

let centerX : Double = 100
let centerY : Double = 100

func inRange(x : Double, y : Double) -> Bool {
let disX = x - centerX
let disY = y - centerX

let dis = sqrt(pow(disX, 2) + pow(disY, 2))

return dis < 200
}

let x : Double = 100
let y : Double = 1000

inRange(x, y: y)

问题

但是这样有一个不足,当我们需要比较很多个点和Center的距离的时候,这些数字并不能明确告诉我们它们代表的位置的意义,甚至我们都无法知道它们代表一个数字。

如果我们可以像这样来比较位置:

相比数字,它们看上去就会直观的多

而这,就是我们需要自定义struct类型最直接的原因

inRange(location1)
inRange(myHome)


使用结构进行改进

// 初始化结构体
struct Location {
var x : Double
var y : Double
}
// 创建结构体
let location = Location(x: 90, y: 90)
// 优化刚才的方法
func inRange(location : Location) -> Bool {
let disX = location.x - centerX
let disY = location.y - centerY
let dis = sqrt(pow(disX, 2) + pow(disY, 2))
return dis < 200
}
inRange(location)

结构体的增强

扩充构造函数

默认情况下创建Location时使用Location(x: x值, y: y值)

但是为了让我们在使用结构体时更加的灵活,swift还可以对构造函数进行扩充

扩充的注意点

在扩充的构造函数中必须保证成员变量是有值的

扩充的构造函数会覆盖原有的构造函数

struct Location {
var x : Double
var y : Double
init(x : Double, y : Double) {
self.x = x
self.y = y
}
init(xyString : String) {
let strs = xyString.componentsSeparatedByString(",")
x = Double(strs.first!)!
y = Double(strs.last!)!
}
}
let location = Location(x: 100, y: 100)
let location1 = Location(xyString: "100,100")


为结构体扩充方法

为了让结构体使用更加灵活,swift的结构体中可以扩充方法

例子:为了Location结构体扩充两个方法

向水平方向移动的方法

向垂直方向移动的方法

struct Location {
var x : Double
var y : Double
init(x : Double, y : Double) {
self.x = x
self.y = y
}
init(xyString : String) {
let strs = xyString.componentsSeparatedByString(",")
x = Double(strs.first!)!
y = Double(strs.last!)!
}
mutating func moveH(x : Double) {
self.x += x
}
mutating func moveV(y : Double) {
self.y += y
}
}

注意:

如果我们使用的Location不是自己定义的,但是我们仍旧希望在自己的项目里扩展Location的操作

Swift也能帮我们达成,这个机制,叫做extension

extension Location {
mutating func moveH(x : Double) {
self.x += x
}

mutating func moveV(y : Double) {
self.y += y
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: