Swift基本语法(强类型语言)
语句结束 —>;
不需要分号, 回车即可,多语句并列时,可使用
alloc init —> ()
alloc initWithXXX —> (XXX: )
类函数 —> .
可以省略self. 最好不要加, 闭包中需要self.
枚举类型 —> 分开写, 加.
NSLog打印 —> print 带换行
selection —> “xxx”
字符串拼接 —> ...\(字符串)
方法:
func click(sender:UIButton){
print("点我了---\(str)")
}
1.常量|变量:
let —> 常量, 尽量用let
var —> 变量, 必要修改时再用var
自动推导右侧类型, 任何时候都不会做隐式转换, 必须是相同类型进行计算, 类型不同需要强转
强转 —> 类型()
浮点类型默认 —> Double
整数类型默认 —> Int
*可选项 Optional: 一个变量, 可为本身类型, 也可为nil
eg. let x: Double = 20
print(x + 1.5)
let y: Int? // 可以是整数, 也可以是nil, 如果是变量, 默认是nil
var z: Int? = 10
可选项不能直接计算, ! —> 强行解包(unwrapping), 程序员承诺一定有值, 如果没有就崩
构造函数有? —> 不一定能创建出对象
没有? —> 一定有值, 没有就崩
提示: 可选项注意思考为什么?
2.控制流:
if
if 变化:
-1. 没有(), 必须有{}
格式: if 条件 {}
-2. 没有非零即真, 只有true和false
-3. 三目很常用
if let 用法: 分支内部处理
if let name = oName {
print("xxx" + name)
}
// 多值判断
if let name = oName, age = oAge {
print("xxx" + name + age)
}
guard let … else … 用法: 分支外部处理
与if let相反, 保证一定有值
guard let age = oAge else {
print("age为nil")
}
swith 变化:
-1.不需要break, 必须涵盖所有条件, 每个case至少包含一条语句, 无内容用break代替
-2.任意数据类型可判断
-3.各case之间不会穿透, 多指用,分隔
-4.定义变量, 不用{}分隔作用域
3.字符串:
String 用法:
-1.拼接 —> \(变量名)
-2.String类型 —> 结构体, 量级更轻
-3.支持直接遍历
-4.字符串长度 —> strin.characters.count
-5.格式化 —> String(format: "%d", arguments:[数组])
String(format: "%d", 参数,…)
-6.取子串: NSString
let str = "xxxnihao"
let s1 = (str as NSString).substringWithRange(NSMakeRange(n, n))
// 变化最频繁
let s2 = str.substringFromIndex("1234".endIndex) // 4个字符长开始取, 1234只为占位
// ihao
// 指定范围 ..<
// advancedBy 正数向右移动, 负数向左移动
let startIndex = str.startIndex.advancedBy(2)
let endIndex = str.endIndex.advancedBy(-2)
// 掐头去尾
let range = startIndex..<endIndex
let s3 = str.substringWithRange(range)
// xnih
4.循环:
for
for 变化:
-1.没有()
for in 变化:
-1.范围: 注意不要多加空格
for i in 0..<9 { // 0~8}
for i in 0…9 { // 0~9} // 0…9 == 0..<10
5.集合:
数组:
-1.[] 定义:
[String] [NSObject]
let array = ["xxx", "xxx"]
let array = ["xxx", "xxx", 29]
-2.可直接存基本数据类型
-3.结构体同样需要包装成 NSValue —> NSValue(CGPoint: CGpoint(x:10, y:29))
-4.可变 | 不可变: var | let
-5.指定类型:
var array: [NSObject] = []
var array: [AnyObject] = [] // 范围更大, 没有任何父类
-6.遍历:
for s in array {
print(s)
}
-7.增删改查:
增: array.append()
删: array.removeFirst()
array.removeLast()
array.removeAll(keepCapacity: true) // 保持容量
改: array[index] = "xxx" // 下标获取元素
数组容量: array.capacity
分配空间: array = [String]()
-8.合并:
var array = []
let array2 = []
// 将array2 合并到array
array += array2
// 注意: 合并时, 数组类型必须保持一致
字典:
-1.定义: ["ddd": "xxx", "ggg": 19]
-2.类型: [String: NSObject] | 键: 值
[String: AnyObject] 类型最多, 网络获取json有要求, key必须是String
-3.可变 | 不可变: var | let
可变: 如果key存在, 覆盖; 不存在, 新增
-4.遍历:
for (key, value) in dict {
print("k:\(key)——v:\(value)")
}
-5.增删改查:
改: dict["nnn"] = "xxx"
-6.合并:
var dict = []
let dict2 = []
// 将dict2 合并到dict, 如果key存在, 覆盖; 不存在, 新增
for (key, value) in dict2 {
dict[key] = value
}
6.函数:
-1.格式: func 函数名(形参列表) -> 返回值类型 {}
func sum(x: Int, y: Int) -> Int {
return x+y
}
调用: sum(29, y: 39) // 默认第一个参数名可省略
-2.外部参数:
func sum(num1 x: Int, num2 y: Int) -> Int {
return x+y
}
调用: sum(num1: 29, num2: 39) // 方便调用者明确各参数的语义
-3.无返回值格式:
1>啥都不写
2> Void
3> ()
eg.
func demo1 {
print("")
}
func demo2 -> Void {
print("")
}
func demo3 -> () {
print("")
}
7.闭包:(类似block)
-1.定义: 所有代码都放在{参数 返回值 执行代码}中
有参有返回:
格式: { (外部参数 形参列表) -> 返回值 in // 执行代码}
let sumFunc = {
(num1 x: Int, num2 y: Int) -> Int
in // 用于区分函数定义和执行代码
return x+y
}
// 外部参数很重要, 能够有智能提示
调用: sum(num1: 29, num2: 39)
无参无返回:
格式: () -> ()
let demo = { // 代码 }
调用: demo()
函数本身就可做参数传递
let sumFunc = sum
let r = sumFunc(10, y: 29) // r -> Int类型
func sum(num1 x: Int, num2 y: Int) -> Int {
return x+y
}
-2.应用场景: 异步加载网络数据, 完成回调
与block对比:
-3.尾随闭包:
闭包参数是函数的最后一个参数 -> 尾
函数的)结束可以前置到倒数第二个参数的末尾
最后一个,分隔符可省略
-4.简化闭包: 无参无返回可省略
8.解除循环引用(Block):