swift的語法確實高端,用習慣了編程特別順手。
swift中的變量分為兩類,變量(var)和常量(let),常量聲明時必須有一個初值,變量聲明時不必有初值,但要指定類型。
1.Int 和 Float
let a:Int = 1
let b:Float = 1.1
let var
let str = "hello"
str.characters.count ?// 字符串長度
str.lengthOfBytesUsingEncoding(NSUTF8StringEncoding)
1.2大小寫
str.uppercaseString?
str.lowercaseString
let str2 = String(format: "%02d:%03d", 1,2)
let str3 = String(format: "%02d:%02d", arguments: [1,2])
str2.substringToIndex(<index: Index) // 字符串的拼接,剪切等
字符串的其他操作全部轉化為NSString再去操作
1.3轉換
let str4:NSString = str2 as NSString? //str4是str2轉化為NSString的值
2數組 Array
2.1不可變數組
let array1 = ["A","2","3","4"]
let array2:Array = ["A","2","3","4"]
let array3:[String] = ["A","2","3","4"]
initWith/init在swift里面全部轉化成 ( )
let array4 = [String]()? // 指定是String類型數組
元素個數 .count 來訪問
數組遍歷 for-in(要明確指出數組的)
for temp in array3 as [String]{
print(temp.characters.count)
print(temp)
}
元組遍歷? **針對下標的時候 推薦**
for (index,value) in array3.enumerate()
{
print("index = \(index), value = \(value)")
}
2.2可變數組
var mutableArray = [String]()
mutableArray.append("hello")
mutableArray.append("world")
mutableArray.append(23)
mutableArray.removeAll()
mutableArray.removeAll(keepCapacity: true)
mutableArray.removeFirst(0)
print(mutableArray)
3.字典? Dictionary
3.1不可變字典
let dict = ["key1":"value1", "key2":"value2", "key3":"value3"]
print(dict)
通過key值訪問value值
print(dict["key1"])
字典遍歷不用在dict后面加.enumerate()
for (key,value) in dict
{
print("key = \(key), value = \(value)")
}
3.2可變字典
var dict3 = ["key":"value"]
3.3合并字典
for (tempKey,tempValue) in dict{
如果key存在的則是一個更新鍵值對操作,否則是一個增加鍵值對操作
dict3[tempKey] = tempValue
}
print(dict3)
4 .可選類型
如果一個值可能為nil,那么這個值就是可選類型,用?標識
Optional包圍的就是一個可選類型 (打印出來有Optional)
可選類型不能直接使用,必須進行強制解包,!強制解包,對nil強制解包會造成崩潰
unexpectedly found nil while unwrapping an Optional value 出現這個錯誤的時候就是對一個空的可選類型進行強制解包 ,不能對空的可選類型進行強制解包!
(a1 ?? "234") 對可選類型進行判斷,如果可選類型值為nil,則給它一個默認值("23456")
var a1:String?
a1 = "123"
print(a1)
print(a1!)
print(a1!.characters.count)
print((a1 ?? "23456").characters.count)
5.條件分支
if 條件語句()可以省略, {} 不能省略
if 沒有非零即真的概念,只有true false的兩種情況
let tempValue = 10
if tempValue > 5{
print("tempValue > 5")
}
可選類型的條件分支
let str:String? = "hello"
(1) if-let是對可選類型的判斷,如果可選類型為nil,則不執行代碼塊。如果不為空則用tempStr來接受此刻這個可選類型的解包后的值
if let tempStr = str{
print(tempStr)
}
(2) if-let-where 跟if-let相似,where是對前面定義的這個局部變量再做一層判斷
if let tempStr = str where tempStr.characters.count > 2 {
print("tempStr.length = \(tempStr.characters.count)")
}
(3) guard-let-else (守護)
如果可選類型str為nil,則執行code代碼塊,最后一定要return,如果不為nil則強制解包后的值賦值給tempStr,這樣在{}外面就可以使用tempStr
guard let tempStr = str else {
code
return
}
tempStr....
6.switch
* switch 不局限判斷整型,可以是浮點型,也可以是字符串等等
* switch 后面的小括號可以省略,大括號不能省略
* case 后面至少要有一條執行語句!!并且case后面的大括號可以省略,break可以不寫,不會造成貫穿
* default一定要寫,并且只能寫在最后
let f = 3.2
switch f {
case 3.0:
print("==3.0")
case 3.1:
print("==3.1")
case 3.2:
print("==3.2")
default:
print("unknow")
}
該寫法在swift2.2的時候被廢棄掉了
for (var i = 0 ; i < 5; i++){}
for var i = 0; i < 5; i+1 { print(i) }
用下面這個
for i in 0..<5 { // 0..<5 --- [0,5) 0...5 --- [0,5]
? ? print("i=\(i)")
}
7.枚舉(枚舉值可以關聯浮點,字符串等,沒有默認的關聯值)
關聯如果是Int,會默認的遞增上去;如果不是Int類型,必須每個枚舉值都關聯上對應的值
enum Month:Float {
case January = 11.2
case February = 12.2
case March = 13.6
case April = 14.2
case May = 15.4
case June = 17.6
}
如果明確指出一個變量/常量是屬于哪種枚舉類型的話,可以直接用 .枚舉值 來賦值,否則就用 枚舉類型.枚舉值
let month = Month.January
let month2:Month = Month.January // let month2:Month = .January
var month1 = Month.January
month1 = .February
switch month{
case .January:
print("hashValue = \(month.hashValue),rawValue = \(month.rawValue)")
print(month)
case .February:
print("hashValue = \(month.hashValue),rawValue = \(month.rawValue)")
print(month)
case .March:
print("hashValue = \(month.hashValue),rawValue = \(month.rawValue)")
print(month)
case .April:
print("hashValue = \(month.hashValue),rawValue = \(month.rawValue)")
print(month)
default :
print("hashValue = \(month.hashValue),rawValue = \(month.rawValue)")
print("noValue")
}
8.懶加載
* lazy var 變量名:變量類型 = {
*? ? ? code
*? ? ? return
*? }( )
lazy var btn:UIButton = {
var tempBtn = UIButton(type: UIButtonType.ContactAdd)
tempBtn.frame = CGRectMake(90, 100, 50, 50)
tempBtn.backgroundColor = UIColor.cyanColor()
return tempBtn
}()
9.異常捕獲
let path = NSBundle.mainBundle().pathForResource("iOS", ofType: "json")
let data:NSData = NSData(contentsOfFile: path!)!
do{
let rootArray = try NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers) as! [[String:String]]
print(rootArray)
}catch{
// 異常捕獲,序列化出錯的時候就自動來到這里
print("error")
}
10.閉包
{
(參數名:參數類型) -> 返回值類型
in
code,執行代碼
}
無參無返
let closure = {
()->()? // ()->void? // ()? 3種
in
print("無參無返")
}
closure()
有參無返
let closure1 = {
(str:String,str1:String)->Void
in
print("有參無返\(str),\(str1)")
}
closure1("hello","world")
無參有返
let closure2 = {
()->String
in
print("無參有返")
return "無參有返"
}
print(closure2())
有參有返
let closure3 = {
(str:String,str1:String)->String
in
print("有參有返\(str),\(str1)")
return str+str1
}
print(closure3("1","2"))
練習
定義一個方法 (輸入參數color,frame,closure(是將剛才的color,frame當做參數,返回一個UIView),返回一個UIView)
func creatUIView(color:UIColor,frame:CGRect,closure:(tempColor:UIColor,tempFrame:CGRect)->UIView)->UIView{
let view:UIView = closure(tempColor: color, tempFrame: frame)
return view
}
調用函數:
let view = creatUIView(UIColor.redColor(), frame: CGRectMake(100, 100, 100, 100)) { (color, frame) -> UIView in
let tempView = UIView(frame: frame)
tempView.backgroundColor = color
return tempView
}
view.addSubview(view)
11.函數
func 方法名(參數列表)-> 返回值類型{
code
}
無參無返
func func1()->Void{
print("無參無返")
}
有參無返
func func2(str:String)->Void{
print("\(str)")
}
有參有返
func func3(str:String)->String{
return str+"有參有返"
}
無參有返
func func4()->String{
return "無參有返"
}
12.字典轉模型
class Person: NSObject {
字典轉模型,模型中如果有基本數據類型的話,基本數據類型不可以為可選類型,否則在KVC賦值中會找不到對應的key值.如果為可選類型的話應該給初始值
var name:String?
var age:Int = 0
var gender:String?
字典轉模型
init(dict:[String:AnyObject]) {
super.init()
setValuesForKeysWithDictionary(dict)
}
this class is not key value coding-compliant for the key age.'出現這個錯誤一般都是字典轉模型的時候出錯
如果自定義了初始化方法并且沒有實現系統默認的初始化方法,那么外界訪問不到該類的默認初始化方法,想要訪問的話必須手動實現
override init() {
super.init()
}}
13.創建單例
class SingleDog: NSObject {
var name:String?
單例第一種寫法
? ? static var shareSingleDog:SingleDog = {
? ? ? ?let instance = SingleDog()
? ? ? ? return instance
? ? }()
單例第二種寫法
static let instance = SingleDog()
static func shareSingleDog()->SingleDog{
return instance
}
}