一、变量声明
与oc相比更简洁,编译时的检错机制更完善
1、let声明常量,var声明变量
var myVariable = 42
myVariable = 50
let myConstant = 42
2、如果初始化时直接赋值可以不声明类型,swift会自己识别(即类型推断)。反之需要用冒号:声明变量类型
let myString = "Hello World"
print(myString);//;加不加都可以,不会报错
let mStr = "Hello World"
let mString:String
print(mStr)
let isBool = true
print(isBool)
let width:Float = 4
print(width)
2.1、转换数据类型
(1)、显示转换
let lable = "The width is"
let width1 = 94
let labelWidth = lable + String(width1)
(2)、可用反斜杠插入变量(隐式转换)
var widthLLabel = "lable \(width1)"
widthLLabel = lable+"\(width1)"
2.2、数组和字典都可用[]直接声明内容。结尾可以是,
var shoplist = ["apple","oranges","chocolate",]
shoplist[0] = "cookie"
(1)、字典可以直接用[key]访问元素,直接赋值来添加元素。
var occ = ["Mom":"Mama","Dad":"Baba"]
occ["Sister"] = "Jiejie";
print(occ)
(2)、数组在添加元素时会自动变大
shoplist.append("fruit")
print(shoplist)
(3)、使用初始化语法创建一个空的数组或字典
var emptyArr = [String]()
var emptyDic = [String:Float]()
(4)、如果类型可以被推断出来,可以直接用[]和[:]创建一个空的数组或字典
emptyArr = []
emptyDic = [:]
3、声明变量时如果一定要用关键字(如class,id),可加重音符号`声明(不推荐使用关键字声明变量)
let `class` = "CSDN"
print(`class`)
4、类型别名——对当前的类型定义了另一个名字,类型别名通过使用typealias关键字来定义
//typealias newname = typeName
typealias Feet = Int
5、可选型Optional——用于处理数值存在缺失的情况,表示“那可能没有值”,可简写为问号?
5.1、一个可选的值是指一个具体的值或者是用nil表示值缺失。在类型后面加一个?来标记这个变量的值是可选的
var optionInt:Optional<Int>
var myInt:Int? = 1
var opionSt:Optional<String>
var myStr:String? = nil;
let optionalStr:String? = ""
print(optionalStr == nil)
5.2、可以通过使用??操作符提供一个默认值来处理可选值。如果可选值缺失的话,可以使用默认值来代替。
let nikename:String? = nil
let fullName = "John"
let informal = "Hi,\(nikename ?? fullName)"
print(informal)
myStr = "Hello Swift!";
if myStr != nil {
print(myStr ?? "")
}else{
print("myStr值为nil")
}
5.3、可选类型–数组
(1)、要用括号()来定义可选型?的作用域。
var optionArr:([Int])
var optionArr1:([String])
6、swift对空格有要求,运算符不能直接跟在变量或者常量的后面.
let a=1+2
let b = 2 + 3
//let m = 1+ 2会报错,swift会判定在1+之后语句结束。
print(a+b)
二、控制流
与oc相比更规范,语法要求更严格
1、if语句
1.1、if语句,条件必须是一个布尔表达式,不会默认与0作对比
let inScores = [60,70,80,100,12]
var teamScore = 0
for score in inScores {
if score>50 {
teamScore += 3
}else{
teamScore += 1
}
}
print(teamScore)
1.2、可以一起使用if和let一起来处理值缺失的情况。
(1)、如果变量的可选值是nil,条件会判断为false,大括号中的代码会被跳过。如果不是nil,会将值解包并赋给let后面的常量,这样代码块中就可以使用这个值了。(即如果name拿不到值或者拿到nil判定为false,反之则判定为true)
let optionalName:String? = nil
var greeting = "Hello!"
if let name=optionalName {
greeting = "hello,\(name)"
}else{
greeting = "hello,\(optionalName ?? "")"
}
print(greeting)
2、for-in语句
2.1、你可以在循环中使用…<来表示下标范围。使用…<创建的范围不包含上界(即小于上界值),如果想包含的话需要使用…
for x in a...b {
//terminator的含义是将换行符\n置为""(可以理解为使换行符消失)
print("\(x) ",terminator:"")
}
var total = 0
for i in 0..<4 {
total += i
}
print(total)
for x in 0..<array.count {
if x > 0 {
}
}
2.2、你可以使用for-in来遍历字典,需要一对儿变量(key,value)来表示每个键值对。字典是一个无序的集合,所以他们的键和值以任意顺序迭代结束。
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
var largestKind = ""
for (kind,numbers) in interestingNumbers {
for number in numbers {
if number > largest {
largest = number
largestKind = kind
}
}
}
print("largest is \(largest), largestKind is \(largestKind)")
3、switch语句
3.1、switch支持任意类型的数据(int,double,float,string等等) 以及各种比较操作(相等,包含,前缀,后缀等等)
(1)、与oc相比——运行switch时,匹配到case语句之后,程序会退出switch语句,并不会继续向下执行,所以不需要在每个句子结尾写break。case条件可以是单个或者多个。
let vegetable = "cucumber"
switch vegetable {
case "celery":
print("Add some raisins an make ants on a log.")
case "cucumber","watercress":
print("That woudle make a good sandwich.")
case let x where x.hasSuffix("pepper")://let将匹配常量的值赋给x
print("Is it a spicy \(x)?")
default:
print("Everything tastes good in soup")
}
4、while语句
4.1、使用while来重复运行一段代码直到不满足条件。循环条件可以在开头也可以在结尾,保证能至少循环一次。
var n = 2
while n < 100 {
n *= 2
}
print(n)
var m = 2
repeat {
m *= 2
} while m < 100
print(m)