您所在的位置: 首页 > 教程首页 > 新闻资讯 > 苹果Swift语言入门教程

苹果Swift语言入门教程

来源:互联网 | 编辑:啤酒 | 时间:2014-06-03 20:28:33 | 阅读:16777215

注意 EquilateralTriangle 的构造器有3个不同的步骤:

设置属性的值 调用超类的构造器 改变超类定义的属性的值,添加附加的工作来使用方法、getter、setter也可以在这里

如果你不需要计算属性,但是仍然要提供在设置值之后执行工作,使用 willSet 和 didSet 。例如,下面的类要保证其三角的边长等于矩形的变长。

class TriangleAndSquare {

var triangle: EquilaterTriangle {

willSet {

square.sideLength = newValue.sideLength

}

}

var square: Square {

willSet {

triangle.sideLength = newValue.sideLength

}

}

init(size: Double, name: String) {

square = Square(sideLength: size, name: name)

triangle = EquilaterTriangle(sideLength: size, name: name)

}

}

var triangleAndSquare = TriangleAndSquare(size: 10, name: "another test shape")

triangleAndSquare.square.sideLength

triangleAndSquare.triangle.sideLength

triangleAndSquare.square = Square(sideLength: 50, name: "larger square")

triangleAndSquare.triangle.sideLength

类的方法与函数有个重要的区别。函数的参数名仅用与函数,但方法的参数名也可以用于调用方法(除了第一个参数)。缺省时,一个方法有一个同名的参数,调用时就是参数本身。你可以指定第二个名字,在方法内部使用。

class Counter {

var count: Int = 0

func incrementBy(amount: Int, numberOfTimes times: Int) {

count += amount * times

}

}

var counter = Counter()

counter.incrementBy(2, numberOfTimes: 7)

当与可选值一起工作时,你可以写 "?" 到操作符之前类似于方法属性。如果值在"?"之前就已经是 nil ,所有在 "?" 之后的都会自动忽略,而整个表达式是 nil 。另外,可选值是未包装的,所有 "?" 之后的都作为未包装的值。在两种情况中,整个表达式的值是可选值。

let optionalSquare: Square? = Square(sideLength: 2.5, name: "optional square")

let sideLength = optionalSquare?.sideLength

7   枚举与结构

使用 enum 来创建枚举。有如类和其他命名类型,枚举可以有方法。

enum Rank: Int {

case Ace = 1 case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten case Jack, Queen, King

func simpleDescrition() -> String {

switch self {

case .Ace: return "ace"

case .Jack: return "jack"

case .Queen: return "queen"

case .King: return "king"

default: return String(self.toRaw())

}

}

}

let ace = Rank.Ace //by gashero

let aceRawValue = ace.toRaw()

Note

练习

编写一个函数比较两个 Rank 的值,通过比较其原始值。

在如上例子中,原始值的类型是 Int 所以可以只指定第一个原始值。其后的原始值都是按照顺序赋值的。也可以使用字符串或浮点数作为枚举的原始值。

使用 toRaw 和 fromRaw 函数可以转换原始值和枚举值。

if let convertedRank = Rank.fromRaw(3) { let threeDescription = convertedRank.simpleDescription() }

枚举的成员值就是实际值,而不是其他方式写的原始值。实际上,有些情况是原始值,就是你不提供的时候。

enum Suit {

case Spades, Hearts, Diamonds, Clubs

func simpleDescription() -> String {

switch self {

case .Spades: return "spades"

case .Hearts: return "hearts"

case .Diamonds: return "dismonds"

case .Clubs: return "clubs"

}

}

}

let hearts = Suit.Hearts //by gashero

let heartsDescription = hearts.simpleDescription()

Note

练习

添加一个 color 方法到 Suit 并在 spades 和 clubs 时返回 "black" ,并且给 hearts 和 diamounds 返回 "red" 。

注意上面引用Hearts成员的两种方法:当赋值到 hearts 常量时,枚举成员 Suit.Hearts 通过全名引用,因为常量没有明确的类型。在 switch 中,枚举通过 .Hearts 引用,因为 self 的值是已知的。你可以在任何时候使用方便的方法。

使用 struct 创建结构体。结构体支持多个与类相同的行为,包括方法和构造器。一大重要的区别是代码之间的传递总是用拷贝(值传递),而类则是传递引用。

struct Card {

var rank: Rank

var suit: Suit

func simpleDescription() -> String {

return "The \(rank.simpleDescription()) of \

(suit.simpleDescription())"

}

}

let threeOfSpades = Card(rank: .Three, suit: .Spades)

let threeOfSpadesDescription = threeOfSpades.simpleDescription()

Note

练习

添加方法到 Card 类来创建一桌的纸牌,每个纸牌都有合并的rank和suit。(就是个打字员的活二,by gashero)。

一个枚举的实例成员可以拥有实例的值。相同枚举成员实例可以有不同的值。你在创建实例时赋值。指定值和原始值的区别:枚举的原始值与其实例相同,你在定义枚举时提供原始值。

例如,假设情况需要从服务器获取太阳升起和降落时间。服务器可以响应相同的信息或一些错误信息。

enum ServerResponse {

case Result(String, String)

case Error(String)

}

let success = ServerResponse.Result("6:00 am", "8:09 pm")

let failure = ServerResponse.Error("Out of cheese.")

switch success {

case let .Result(sunrise, sunset):

let serverResponse = "Sunrise is at \(sunrise) and sunset is at \(sunset)."

case let .Error(error):

let serverResponse = "Failure... \(error)"

}

Note

练习

给 ServerResponse 添加第三种情况来选择。

注意日出和日落时间实际上来自于对 ServerResponse 的部分匹配来选择的。

你可能感兴趣的内容

  • 2021支付宝蚂蚁庄园小课堂8月16日每日一题答案一览
    2021支付宝蚂蚁庄园小课堂8月16日每日一题答案一览
    1、夏天出汗多,每次洗澡得多用几次沐浴露,这种做法?2、所有“脱发人士”都适合做植发手术吗?这里52z飞翔网小编为大家带来2021支付宝蚂蚁庄园小课堂8月16日每日一题答案一览的详细介绍!有兴趣的小伙伴不要错过喔!

    新闻资讯

    2021-08-16

  • 2021山东高考分数线全批次一览
    2021山东高考分数线全批次一览
    2021山东高考分数线是多少?本科分数线是多少?还不清楚的小伙伴看过来,这里52z飞翔网小编为大家带来2021山东高考分数线全批次一览的详细介绍!有兴趣的小伙伴不要错过喔!

    新闻资讯

    2021-06-28

  • 2021福建高考分数线全批次一览
    2021福建高考分数线全批次一览
    2021福建高考分数线是多少?本科分数线是多少?还不清楚的小伙伴看过来,这里52z飞翔网小编为大家带来2021福建高考分数线全批次一览的详细介绍!有兴趣的小伙伴不要错过喔!

    新闻资讯

    2021-06-28

  • 2021浙江高考分数线全批次一览
    2021浙江高考分数线全批次一览
    2021浙江高考分数线是多少?本科分数线是多少?还不清楚的小伙伴看过来,这里52z飞翔网小编为大家带来2021浙江高考分数线全批次一览的详细介绍!有兴趣的小伙伴不要错过喔!

    新闻资讯

    2021-06-28

  • 2021宁夏高考分数线全批次一览
    2021宁夏高考分数线全批次一览
    2021宁夏高考分数线是多少?本科分数线是多少?还不清楚的小伙伴看过来,这里52z飞翔网小编为大家带来2021宁夏高考分数线全批次一览的详细介绍!有兴趣的小伙伴不要错过喔!

    新闻资讯

    2021-06-25

  • 2021青海高考分数线全批次一览
    2021青海高考分数线全批次一览
    2021青海高考分数线是多少?本科分数线是多少?还不清楚的小伙伴看过来,这里52z飞翔网小编为大家带来2021青海高考分数线全批次一览的详细介绍!有兴趣的小伙伴不要错过喔!

    新闻资讯

    2021-06-25

  • 2021甘肃高考分数线全批次一览
    2021甘肃高考分数线全批次一览
    2021甘肃高考分数线是多少?本科分数线是多少?还不清楚的小伙伴看过来,这里52z飞翔网小编为大家带来2021甘肃高考分数线全批次一览的详细介绍!有兴趣的小伙伴不要错过喔!

    新闻资讯

    2021-06-25

  • 2021陕西高考分数线全批次一览
    2021陕西高考分数线全批次一览
    2021陕西高考分数线是多少?本科分数线是多少?还不清楚的小伙伴看过来,这里52z飞翔网小编为大家带来2021陕西高考分数线全批次一览的详细介绍!有兴趣的小伙伴不要错过喔!

    新闻资讯

    2021-06-25

  • 2021西藏高考分数线全批次一览
    2021西藏高考分数线全批次一览
    2021西藏高考分数线是多少?本科分数线是多少?还不清楚的小伙伴看过来,这里52z飞翔网小编为大家带来2021西藏高考分数线全批次一览的详细介绍!有兴趣的小伙伴不要错过喔!

    新闻资讯

    2021-06-25

  • 2021云南高考分数线全批次一览
    2021云南高考分数线全批次一览
    2021云南高考分数线是多少?本科分数线是多少?还不清楚的小伙伴看过来,这里52z飞翔网小编为大家带来2021云南高考分数线全批次一览的详细介绍!有兴趣的小伙伴不要错过喔!

    新闻资讯

    2021-06-25

热门游戏

下载声明 | 法律声明 | 版权声明 | 友情链接 | 发布软件 | 最新更新

本站为非盈利性网站,不接受任何广告。本站所有资源均由网友上传,如有侵权,请发邮件至 hnrshwl@163.com

晋ICP备2024046785号-1