Swift基础知识,快速掌握

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(

字符串的其他操作全部转化为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

}

}

你可能感兴趣的:(Swift基础知识,快速掌握)