非淡泊無以明志,非寧靜無以致遠 - 請靜下心來學習
讀者大大們,大家好,還記得我是誰咩...
對了,我就是那個要荔枝打造解決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)
}
}