iOS Swift基础学习笔记(一)简单值(Simple Values)和控制流(Control Flow)

Swift 初见

通常来说,一个新的编程语言的第一个程序都是从在屏幕上打印“Hello,World!”开始的。在 Swift 中,只需一行即可实现:

print("Hello, world!")

如果你写过C或者Objective-C代码,那你应该很熟悉这种形式——在Swift中,这行代码就是一个完整的程序。你不需要为了输入输出或者字符串处理导入一个单独的库。全局作用域中的代码会被自动当做程序的入口点,所以你也不需要main函数。你同样不需要在每个语句结尾写上分号,就像上面打印“Hello,World!”一样。

另外,为了获得更好的体验,我们可以通过 Xcode 的 playground 来编写 Swift 代码,这样我们可以马上看到自己所写代码的运行结果。

简单值

我们使用 let 来声明常量,使用 var 来声明变量。一个常量值在编译期可以不需要获取,但是只能为常量赋值一次。意思就是可以使用一个常量来表示一个值:只需声明赋值一次,就可以在多个地方使用。

注意:给一个常量或变量赋值时,等号“=” 的左右两边都得有空格,否则会报错。

var myVariable = 42

myVariable = 50

let myConstant = 32

常量或者变量的类型必须和你赋给它们的值一样。当然,你可以不用显式地写出常量或变量的类型。声明的同时赋值的话,编译器会推断出它的类型。像上面的例子,编译器推断出 myVariable 是一个整型(integer),因为它的初值是一个整型。

如果初值没有提供足够的信息(或没有初值),可以通过在变量的后面来指定它的类型,使用冒号隔开:

let implicitInteger = 70

let implicitDouble = 70.0

let explicitDouble: Double = 70

练习:创建一个显式的 Float 类型的常量,并指定值为4。

值永远不会隐式地转换成其他类型。如果你需要将一个值转换成一个不同的类型,必须显式转换成其他类型的 instance,就跟下面的 String(width) 一样,生成了一个 String 类型的实例:

let label = "The width is "

let width = 94

let widthLabel = label + String(width)

注意:上面代码的最后一行代码‘+’必须应用于同一种数据类型操作。

练习: 删除上面代码中最后一行的 String ,错误提示是什么?

有一种更简单的将值转换成字符串的方式:把值写到圆括号中,并在圆括号前面加上一个反斜杠。

let apples = 3

let oranges = 5

let appleSummary = "I have \(apples) apples."

let fruitSummary = "I have \(apples + oranges) pieces of fruit."

练习:使用\()来把一个浮点计算转换成字符串,并加上 人的名字,和他打个招呼。

使用方括号[]来创建数组和字典,并在方括号[]使用下标或者键(key)来访问元素。

var shoppingList = ["catfish", "water", "tulips", "blue paint"]

shoppingList[1] = "bottle of water"

var occupations = [

       "Malcolm" : "Captain",

        "Kaylee" : "Mechanic"  // key : value

]

occupations["Jayne"] = "Public Relations"

要创建一个空数组或者字典,可以使用初始化语法,需要指定其中的element 的类型。

let emptyArray = [String]()

let emptyArray1 = Array<String>()

let emptyDictionary = [String : Float]()

let emptyDictionary1 = Dictionary<String, Float>()

如果类型信息可以被推断出来,你可以用[]来创建空数组和[:]来创建空字典——就像你给一个变量设置一个新值 或者 给函数传参数的时候一样。

shoppingList = []

occupations = [:]

控制流

使用`if`和`switch`来作为条件控制,使用`for-in`,`for`,`while`以及`repeat-while`来构造循环。包装条件和循环变量的圆括号可以省略,但是主体外的花括号是必须要的。

let individualScores = [75, 43, 103, 87, 12]

var teamScore = 0

for score in individualScores {

if score > 50 {

teamScore += 3

} else {

teamScore += 1

}

}

print(teamScore)

在`if`语句中,条件必须是一个布尔表达式——这代表诸如`if score {...}`这样的代码是错误的,并不能隐式地同0进行比较。

你可以同时使用`if`和`let`来防止值的丢失。这些值是可选的,可选通过包含另一个值或者包含`nil`来指明该值不存在。通过在类型后面添加问号(?)来标记一个值为可选。

var optionalString: String? = "Hello"

print(optionalString == nil)  //可以删除`== nil`看看会得到什么结果

var optionalName: String? = "John Appleseed"

var greeting = "Hello!"

if let name = optionalName {

greeting = "Hello, \(name)"

}

练习:设置`optionalName` 为 `nil`,你得到的 greeting 的值会是什么?并且添加一个`else`子句用来在`optionalName` 为 `nil`时,为 greeting 设置一个不同的值。

如果可选值为`nil`,则条件判断为`false`,花括号中的代码会被跳过。反之,可选值去包装并且赋给`let`后面的常量,使得去包装的值可以在代码块内部访问。(去包装可以认为代表着可选是有值的,而非nil,可以直接拿来用。)

另一种操作可选值的方式,使用`??`操作符提供一个默认值。如果该可选值为 nil,设置的默认值将被使用。

let nickName: String? = nil

let fullName: String = "John Appleseed"

let informalGreeting = "Hi, \(nickName ?? fullName)"

switch 支持所有类型的数据,以及多种比较运算——不限于必须是整数,也不限于必须测试相等。

let vegetable = "red pepper"

switch vegetable {

case "celery":

print("Add some raisins and makes ants on a log.")

case "cucumber", "watercress":

print("That would make a good tea sandwich.")

case let x where x.hasSuffix("pepper"):

print("Is it a spicy \(x)")

default:

print("Everything tastes good in soup")

}

练习:尝试删除 default case,会得到什么样的错误?

注意上面代码中在一个模式中如何使用 let 来将匹配模式的值赋给一个常量。

执行完匹配到的 case 后,程序会跳出 switch,而不是继续执行下一个 case,所以不需要在case 的代码后面添加 break 来跳出 switch。

使用`for-in`来遍历字典中的元素,你需要提供一对名字来访问每一个键值对。字典是一个无序的集合,所以它们的键和值可以任意顺序遍历。

let interestingNumbers = [

"Prime": [2, 3, 5, 7, 11, 13],

"Fibonacci": [1, 1, 2, 3, 5, 8],

"Square": [1, 4, 9, 16, 25]

]

var largest = 0

for (kind, numbers) in interestingNumbers {

for number in numbers {

if number > largest {

largest = number

}

}

}

print(largest)

练习:添加一个变量来跟踪哪一种数值是最大,以及最大的那个数值是什么。

使用`while`来重复执行一个代码块直到条件改变。循环条件可以放在最后,用于保证循环至少被执行一遍。

var n = 2

while n < 100 {

n = n * 2

}

print(n)

var m = 2

repeat{

m = m * 2

} while m < 100

print(m)

你可以在一个循环中使用`..<`使索引在一个范围内。

var total = 0

for i in 1..<5 {

total += i

}

print(total)

使用`..<`来创建一个忽略最高值的取值区间,使用`...`构造的范围则同时包含最高值和最低值。

`_`表示一个通配符,当你不需要知道当前执行的循环是哪一次时可以使用它

var secondLoop = 0

for _ in 0...3{

secondLoop += 1

}

print(secondLoop)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,719评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,337评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,887评论 0 324
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,488评论 1 266
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,313评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,284评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,672评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,346评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,644评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,700评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,457评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,316评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,706评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,261评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,648评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,859评论 2 335

推荐阅读更多精彩内容