美文网首页
Swift基础知识,快速掌握

Swift基础知识,快速掌握

作者: 爱新觉罗fate | 来源:发表于2016-07-21 21:49 被阅读14次

    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

    }

    }

    相关文章

      网友评论

          本文标题:Swift基础知识,快速掌握

          本文链接:https://www.haomeiwen.com/subject/ymnbjttx.html