非淡泊无以明志,非宁静无以致远 - 请静下心来学习
读者大大们,大家好,还记得我是谁咩...
对了,我就是那个要荔枝打造解决BUG问题调不好,小葵花课堂特效药
的逗逼程序员。
让我们接着上一局的节奏,把基础牢固滴打下去!
一、常量基本概念
常量,表示一些固定的数据,也就是不能改变的数据【游戏关卡/名称】
1 常量分类
整型常量,也就是整常数。
- 二进制
- 十进制
- 八进制
- 十六进制
实型常量。
- 单精度
- 双精度
字符型常量。
- 普通字符
- 转义字符
字符串常量。
- 将一个或者多个字符用双引号("")括起来,这样构成的就是字符串常量。
- 注意字符串常量和字符型常量是不一样的。
2 OC中声明定义常量
格式: const 数据类型 常量名称 = 值
const int NUM = 998;
二、变量基本概念
表示的数据是可以经常修改的。当一个数据的值需要经常改变或者不确定时,就应该用变量来表示【比如游戏积分】
1如何定义变量
- 定义变量(声明), 任何变量在使用之前,必须先进行定义。
定义变量的目:在内存中分配一块存储空间给变量,方便以后存储数据。
如果定义了多个变量,就会为这多个变量分别分配不同的存储空间。
-
格式1: 变量类型 变量名称 ;
int a;float b;
char ch;
-
格式2:变量类型 变量名称,变量名称;
连续定义, 多个变量之间用逗号(,)号隔开int a,b;
int a,b,c,d;
-
定义并初始化
int a = 10; // 完全初始化
int value; // 先定义,后初始化
value = 998;
-可以修改变量的值,多次赋值。每次赋值都会覆盖原来的值
int i = 10;
i = 20; // 修改变量值
三、Swift中的常量和变量
在Swift中规定:在定义一个标识符时必须明确说明该标识符是一个常量还是变量
- 使用let来定义常量,定义之后不可以修改
- 使用var来定义变量,定义之后可以修改
1基本使用
import UIKit
let a : Int = 10
a = 20
// 错误写法,当一个字段定义为常量时是不可以修改的
var b : Int = 20
b = 30
// 因为b定义为变量,因此是可以修改的
常量和变量的使用注意:
- 在使用过程中,建议先定义常量,如果需要修改再修改为变量(更加安全)
- [常量的本质.]是指向的对象不可以再进行修改.但是可以通过指针获得对象后,修改对象内部的属性
// 注意:声明为常量不可以修改的意思是指针不可以再指向其他对象.
// 但是可以通过指针拿到对象,修改其中的属性 例如下 修改了view1的backgroundColor属性值
// Swift对象中不需要*
var view : UIView = UIView()
view = UIView() //变量可以修改指向其他对象
let view1 : UIView = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
view1.backgroundColor = UIColor.redColor()
// 枚举类型的用法:类型.枚举的值
let btn : UIButton = UIButton(type: UIButtonType.Custom)
btn.backgroundColor = UIColor.blueColor()
btn.setTitle("按钮", forState: UIControlState.Normal)
btn.frame = CGRect(x: 20, y: 20, width: 60, height: 30)
view1.addSubview(btn)
四、共同点和区别 小结
1 区别
- OC
变量 int = 20;
常量 const int = 20; - Swift
变量 var number: Int = 20
常量 let number: Int = 20
尽量先用 let,只有真正需要变的时候,再用 var. - Swift类型推断
指定类型 var dValue: Double
自动推导 var dValue = 22.2
- 在可能的地方,使用Swift的类型推断以减少多余的类型信息
除非需要明确数据类型的长度或者定义时不初始化才需要指定数据类型
数据类型
Swift是类型安全的语言, 如果取值错误会直接报错
取值不对和溢出
OC:
unsigned int intValue = -10; // 不会报错
int intValue = INT_MAX + 1; // 不会报错
Swift:
var intValue:UInt = -10 // 会报错
var intValue:UInt = UInt.max + 1 // 会报错
- swift 对数据类型要求异常严格
- swift 中任何时候,都不会做
隐式转换
- 如果要对不同类型的数据进行计算,必须显示类型转换(强制类型转换)
// OC可以
int intValue = 10;
double doubleValue = intValue;
// Swift:不可以
var intValue:Int = 10
// var doubleValue:Double = intValue //错误
var doubleValue:Double = Double(intValue)
// Double和CGFloat也需要转换
let size = CGSize(width: 10, height: 10)
let res = size.width + CGFloat(dValue)
2 Swift中的类型推导
- Swift是强类型的语言
- Swift中任何一个标识符都有明确的类型
- 注意:
- 如果定义一个标识符时有直接进行赋值,那么标识符后面的类型可以省略.
- 因为Swift有类型推导,会自动根据后面的赋值来决定前面的标识符的数据类型
- 可以通过option+鼠标左键来查看变量的数据类型
// 定义变量时没有指定明确的类型,但是因为赋值给i一个20.20为整型.因此i为整型
var i = 20
// 错误写法:如果之后赋值给i一个浮点型数值,则会报错
// i = 30.5
// 正确写法
var j = 3.33
j = 6.66
3 Swift中基本运算
- Swift中在进行基本运算时必须保证类型一致,否则会出错
- 相同类型之间才可以进行运算
- 因为Swift中没有隐式转换
- 数据类型的转化
- Int类型转成Double类型:Double(标识符)
- Double类型转成Int类型:Int(标识符)
let a = 10
let b = 3.14
// 错误写法
// let c = a + b
// let c = a * b
// 正确写法
let c = Double(a) + b
let d = a + Int(b)
4 共同点[作用域]
变量,按照作用域的范围可分为两种, 即局部变量和全局变量。
4.1 局部变量
- 局部变量也称为内部变量。局部变量是在函数内作定义说明的。其作用域仅限于函数内(代码块), 离开该 函数后再使用这种变量是非法的。
- 例如: OC中的
- ( int)func1{
int i = 998; // 作用域开始
return 0;
}// 作用域结束
- ( int)func2{
{
int i = 998; // 作用域开始
}// 作用域结束
return 0;
}
- 例如: Swift中的
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let num : Int = 998 // num作用域开始
do {
var value : Double = 99.8// value作用域开始
print("\(num)~\(value)")
}// value作用域结束
print("\(num)~\(value)")
}// num作用域结束
func test() -> () {
print("\(num)~\(value)")
}
}
- 作用域补充说明:
- 主函数中定义的变量也只能在主函数中使用,不能在其它函数中使用。同时主函数中也不能使用其它函数中定义的变量。因为主函数也是一个函数,它与其它函数是平行关系。
- 形参变量是属于被调函数的局部变量,实参变量是属于主调函数的局部变量。
- 允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆。虽然允许在不同的函数中使用相同的变量名,但是为了使程序明了易懂,不提倡在不同的函数中使用相同的变量名。
4.2全局变量
- 全局变量也称为外部变量,它是在函数外部定义的变量。
- 例如OC中的
@implementation ViewController
NSString *ID = @"Mumu";
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@"ID is %@",ID);
}
@end
- 例如Swift中的
import UIKit
private let reuseIdentifier = “Cell” //本文件内都可使用
class ViewController: UITableViewController {
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell = tableView.dequeueReusableCellWithIdentifier(cellID)
}
}