简介:
Swift 是一门进行 iOS 和 OS X 应用开发的新语言。然而,如果你有 C 或者 Objective-C 开发经验的话,你会发现 Swift 的很多内容都是你熟悉的。
Swift 包含了 C 和 Objective-C 上所有基础数据类型,Int表示整型值;Double和Float表示浮点型值;Bool是布尔型值;String是文本型数据。Swift 还提供了三个基本的集合类型,Array,Set和Dictionary,详见集合类型。
就像 C 语言一样,Swift 使用变量来进行存储并通过变量名来关联值。在 Swift 中,广泛的使用着值不可变的变量,它们就是常量,而且比 C 语言的常量更强大。在 Swift 中,如果你要处理的值不需要改变,那使用常量可以让你的代码更加安全并且更清晰地表达你的意图。
除了我们熟悉的类型,Swift 还增加了 Objective-C 中没有的高阶数据类型比如元组(Tuple)。元组可以让你创建或者传递一组数据,比如作为函数的返回值时,你可以用一个元组可以返回多个值。
Swift 还增加了可选(Optional)类型,用于处理值缺失的情况。可选表示“那儿有一个值,并且它等于 x ”或者“那儿没有值”。可选有点像在 Objective-C 中使用nil
,但是它可以用在任何类型上,不仅仅是类。可选类型比 Objective-C 中的nil
指针更加安全也更具表现力,它是 Swift 许多强大特性的重要组成部分。
Swift 是一门类型安全的语言,可选类型就是一个很好的例子。Swift 可以让你清楚地知道值的类型。如果你的代码期望得到一个String
,类型安全会阻止你不小心传入一个Int
。你可以在开发阶段尽早发现并修正错误。
参考文章:《The Swift Programming Language》中文版
跟着溜一遍
数据类型:常亮与 变量 let 用来生命常量,var 用来声明变量 一个常量的值,在编译的时候,并不需要有明确的值,但是你只能为它赋值一次。也就是说你可以用常量来表示这样一个值:你只需要决定一次,但是需要使用很多次。常量或者变量的类型必须和你赋给它们的值一样。然而,声明时类型是可选的,声明的同时赋值的话,编译器会自动推断类型。在上面的例子中,编译器推断出myVariable是一个整数(integer)因为它的初始值是整数。
常量与变量
最基础的数据类型 就是 常量与变量
如果初始值没有提供足够的信息(或者没有初始值),那你需要在变量后面声明类型,用冒号分割。术语叫做 类型标注
常量与变量名不能包含数学符号,箭头,保留的(或者非法的)Unicode 码位,连线与制表符。也不能以数字开头,但是可以在常量与变量名的其他地方包含数字。
var welcomeMessage: String
yVariable = 50
let myConstant = 42
let implicitInteger = 70
let implicitDouble = 70.0
let explicitDouble:Double = 70 //声明中的冒号代表着“是...类型”,
值永远不会被隐式转换为其他类型。如果你需要把一个值转换成其他类型,请显式转换。 转换的时候➕号与 转换类型之间需要有空格
注意:一般来说你很少需要写类型标注。如果你在声明常量或者变量的时候赋了一个初始值,Swift可以推断出这个常量或者变量的类型,请参考类型安全和类型推断。在上面的例子中,没有给welcomeMessage
赋初始值,所以变量welcomeMessage
的类型是通过一个类型标注指定的,而不是通过初始值推断的。
let label = "The width is"
let width = 94
let witdthLabel = label + String(width)
如果去掉String,会提示:MyPlayground.playground:25:25: error: binary operator '+' cannot be applied to operands of type 'String' and 'Int'
有一种更简单的把值转换成字符串的方法:把值写到括号中,并且在括号之前写一个反斜杠。例如:
let apples = 3
let oranges = 5
let appleSummaryt = "I have \(apples) apples."
let fruitSummary = "I have \(apples + oranges) pieces of fruits"
//练习: 使用\()来把一个浮点计算转换成字符串,并加上某人的名字,和他打个招呼。
let age = 3
let chiledName = "archy"
let seeWhat = chiledName + " " + String(age) + " 岁了"
数组与字典
使用方括号[]来创建数组和字典,并使用下标或者键(key)来访问元素。
var shoppingList = ["catfish","water","tulips","blue paint"]
shoppingList[1] = "bottle of water"
print(shoppingList)
var occupations = [
"Malcolm":"Captain",
"Kaylee":"Mecahnic",
]
occupations["Jayne"] = "Public Realtions"
//初始化一个数组或者字典 使用初始化语法
let emptyArray = [String]()
//emptyArray = ["catfish","water","tulips","blue paint"]
let emptyDictionary = [String:Float]()
//如果类型信息可以被推断出来,你可以用[]和[:]来创建空数组和空字典——就像你声明变量或者给函数传参数的时候一样。
//shoppingList = []
//occupations = [:]
控制语句:使用if和switch来进行条件操作,使用for-in、for、while和do-while来进行循环。包裹条件和循环变量括号可以省略,但是语句体的大括号是必须的。
var optionalString:String? = "Hello"
print(optionalString == nil)
var optionalName:String? = "Jobn"
var greeting = "hello"
if optionalName == nil {
greeting = "Hello, archy"
}else{
if let name = optionalName {
greeting = "Hello ,\(name)"
}
}
switch支持任意类型的数据以及各种比较操作——不仅仅是整数以及测试相等。声明'let'可用于匹配某部分固定值的模式,运行switch中匹配到的子句之后,程序会退出switch语句,并不会继续向下运行,所以不需要在每个子句结尾写break。
不加 default 报错:error: switch must be exhaustive, consider adding a default clause
let vegetable = "red pepper,blue pepper"
switch vegetable {
case "celery":
let vegetableComment = "Add some raisins and make ants on a log."
case "cucumber", "watercress":
let vegetableComment = "That would make a good tea sandwich."
case let x where x.hasSuffix("pepper"):
let vegetableComment = "Is it a spicy \(x)?"
default:
let vegetableComment = "Everything tastes good in soup."
}
你可以使用for-in来遍历字典,需要两个变量来表示每个键值对。字典是一个无序的集合,所以他们的键和值以任意顺序迭代结束。
let intetestingNumbers = [
"Prime": [2,3,5,7,11,13],
"Fibonacci": [1,1,2,3,5,8],
"Square": [1,4,9,16,25],
]
// kind numbers 对应键值对
var largest = 0
var largestName = String()
for (kind, numbers) in intetestingNumbers{
for number in numbers{
if number > largest {
largest = number
largestName = kind;
}
}
}
print("largestName + \(largest) ")
do while 由repeat while 来代替
var n = 2
while n < 100 {
n = n * 2
}
print(n)
var m = 2;
// do while 由repeat while 来代替
repeat {
m = m * 2
}while m < 100
print(m)
for 循环你可以在循环中使用..<来表示范围,也可以使用传统的写法,两者是等价的,比如下面 0 与4 中间是不可以由空格的,否则会报语法错误
使用..<创建的范围不包含上界,如果想包含的话需要使用...。0...2 表示的是 1 和 2 ,0..<2 表示的是 1
var firstForLoop = 0
for i in 0..<2 {
firstForLoop += i
}
print(firstForLoop)
网友评论