swift5分钟语法速记

国庆在家,又把swift相关语法部分看了一遍,并整理了swift语法速记,帮助我们快速记住swift语法和查找对应语法。

(一)类型

常见类型

Int,String,Double,struct,enum,class,tuple

//typle 元组类型
//声明
let someTuple:(Int,Int) = (10,23)
//元组可以设置名称
var person = (name:"liuyw",age:30)
//取值方式1
person.0
person.1
//取值方式2
person.age
person.name
//取值方式3
var (personName,personAge) = person
personName
personAge

someTuple.0或者tuple.1

//typealias
//类型的别名关键字

//函数类型
func

//可选类型
var num:Int? = nil
var num1:Optional<Int> = nil

//隐式解析可选
var num:Int!
var num1:ImplicitlyUnwrappedOptional<Int>

//协议合成类型
var someProtocol:protocol<protocol1,protocol2>

Array

//声明
var array1:[String] = ["0","1","2","3"]
var array = [String]()

//修改值
array1 += ["4","5"]
array1[1...3] = ["a","b","c","d","e"]
//array1.append
//array1.removeAtIndex(<index:Int Int>)
//array1.insert(<newElement:Element>, atIndex:<Int>)

//获取值
print(array1)
print(array1[0])
print(array1.last)
print(array1.first)

var str:String = ""

//遍历
for item:String in array1{

}


for bgen in array1.enumerate()
{
    print("元素下标:\(bgen.0)  元素值:\(bgen.1)")
}

dictionary


//声明
var dic:Dictionary<String,String> = ["name":"liu","age":"30"]
var dic1 = Dictionary<String,String>()

//修改值
dic["name"] = "liuyanwei"
dic["name1"] = "liuyanwei1"
dic.updateValue("liuyw", forKey: "name")//返回原值
dic1.indexForKey("name1")
dic.removeValueForKey("name")

//获取值
dic["name"]

//字典的循环
for (key,value) in dictionary{
    println("key is: \(key) value is : \(value)");
}


枚举enum


//整形的枚举
enum Sharp:Int{
    case Rect=1,Circle,Star
    //switch中的选项可以用.表示
    func desc()->String{
        switch self{
        case .Rect:
            return "this is rect"
        case .Circle:
            return "this is circle"
        case .Star:
            return "this is star"
        }
    }
}
//enum的值
Sharp.RawValue(1)
//调用枚举的方法
Sharp.Rect.desc()

结构struct

//结构
//结构和类的最重要的区别就是架构是传值,类是传引用
struct Sharp{
    //属性
    var width:Int
    var height:Int
    //方法
    func area()->Int{
        return self.width*self.height;
    }
    //允许修改属性的方法前缀 mutating
    mutating func zoomIn() {
        self.width += 100
        self.height += 100
    }
}

协议


//可以被class,struct,enum实现
protocol Sharp{
    //属性
    var width:String{get}
    var heiht:String{get set}
    //方法
    func area()->Int

}

//swift 可选和必选协议
//只能被class实现,无法给struct和enum实现
@objc protocol OptionalProtocol {
    //可选协议
    optional func optionalMethod()
    //必选协议
    func necessaryMethod()
}

对象

class Card: NSObject {

}
class Person: NSObject {

    //私有对象
    private var _name:String?

    var gender:String
    var gender1:String?

    //arc
    /*
    weak 用于可空对象,unowned用于非空对象
    weak 调用被释放的对象会返回nil,unowned 调用被释放的对象会出异常
    建议 如果能够确定在访问时不会已被释放的话,尽量使用 unowned,如果存在被释放的可能,那就选择用 weak
    */
    weak var bastFriend:Person?
    unowned var identityCard:Card


    //构造函数
    init(name: String) {
        gender = "male"
        identityCard = Card()
        super.init()
        //初始化。。。
        self.name = name
    }
    //便利构造函数
    convenience init(name:String,gender:String)
    {
        self.init(name:name)
        self.gender = gender
    }

    //析构函数
    deinit{

    }

    //属性
    var name:String{
        get{
            return _name!
        }
        set{
            _name = newValue;
        }
        //可以自定newValue的名称
        //set(newName){
        //   _gender = newName
        //}
    }

    //观察者模式的属性
    //newValue 和 oldValue
    var age:Int = 0{
        willSet{}
        didSet{}
    }

    //方法
    func sayName(){
        print("hello name")
    }

    //静态方法
    static func say(){
        print("hello")
    }

    //类方法
    class func say1(){
        print("hello1")
    }

    //方法重载
    override func copy() -> AnyObject {
        return ""
    }

    //懒属性
    //两种方式,方法加载和闭包加载
    lazy var friends:[String] = self.findfriends()
    func findfriends()->[String]{
        return ["bob","bill","jobs"]
    }
    lazy var bastFirends:String = {
        print(" print bastFirends")
        return "liuyanwei"
        }()
    //调用
    //NSLog("bastFirends:%@ and friends is:[%@] ",p.bastFirends,p.friends)

    //下标脚本
    subscript(name:String)->String{
        get{
            return self.name
        }
        set{
            self.name = newValue;
        }
    }


}

(二)语法

流程控制

if语句


//判断是Option类是否有值
if let theStr = str2 {
    print("ture")
}

switch

//switch 数字区间
var condition1 = 888_888_888;
switch condition1{
    case -999_999...38: print("case1");
    case 40...88: print("case2");
    case 100...188: print("case3");
    case 200...999_999_999_999: print("case3");
    default:break;
}

//switch  元组
var condition2 = (100,88);
switch condition2{
    case (-99999...0,-99999...0),(40...88,0..<100): print("case1")//匹配多个条件
case let (_,y): print(y); fallthrough // 值绑定,fallthrough 坠落下一个条件
    case (_,0...100): print("case3");// “_” 匹配所有
    default:break;
}

//switch 值绑定和where语句
var condition3 = 100
switch condition3{
    case let i where i<50 :print("case1")
    case let i where i<120 && i>50 :print("case2")
    default :break;
}

//switch 枚举
enum BarCode{
    case UPCA(Int,Int,Int)
    case QRCode(String)
}
var condition4 = BarCode.UPCA(10, 5, 2)
switch condition4{
    case let .UPCA(a,b,c): print("a:\(a)|b:\(b)|c:\(c)")
    case .QRCode: print("case:2")
//    default: break
}

//对option的判断
let num: Int? = nil
switch num {
    case nil: println("没值")
    default:  println("\(num!)")
}

函数


//无参数
func hello(){}

//有参数
func hello(name:String){}

//有参数和返回值
func hello(name:String)->String{}

//多个参数
func hello(name:String,age:Int){}

//多个返回值
func hello()->(String,Int){
    return (num1,num2,num3)
}

//可变参数
func hello(name:String...){}

//函数的嵌套
func hello1(){
    func hello2(){}
}

//参数的默认值
func hello1(msg:String = "defaultMsg"){}

//返回值是函数
func hello()->(String->String){
     func hello1(name:String)->String{}
     return hello1
}


//参数是函数
fun hello(msg:String,callback(Void->Void)){
    callback()
}

//函数参数是变量
//若不声明var ,默认参数类型是let,就无法修改参数的值
func hello(var msg:String){
    msg += "hello"
    print(msg)
}

//函数参数的命名
func hello(name name:String ,withAge age:Int){}
func hello1(name:String ,age:Int){}
//调用
hello(name:<String>, withAge:<Int>)//默认的参数命名
hello1(<name:String  String>, age: <Int>)//指定的参数命名

//匿名函数
//{}可以作为匿名函数
//例如调用上面的hello方法(参数是函数)
hello("hi",
    {
     //dosthing
    }
)

//有参数的匿名函数
{
    (msg:String)->String in
    return msg
}

//泛型参数
//输入输出参数的函数
func myswap<T>(inout obj1:T,inout _ obj2:T){
    let temp:T = obj1
    obj1 = obj2
    obj2 = temp
}


闭包


var array = ["f","a","c","d","e"]

//完整写法
//{ (参数:类型) in 执行方法 return 返回值}
array.sort({
    (s1:String,s2:String) -> Bool in
    return s2 > s1;
})

//省略参数类型和括号
//{ 参数$1,$2 in 执行方法 return 返回值}
array.sort({
    s1,s2 -> Bool in
    return s1 > s2;
})

//省略参数类型和return关键字
//{ 参数$1,$2 in 返回值}
array.sort({
    s1,s2 ->Bool in
    s1 < s2
})

//省略参数名
array.sort({
    $1 < $0
})

//尾随闭包
array.sort(){
    $1 < $0
}


//上面的几个其实只是匿名函数,不是真正的闭包。swift里面称他们是闭包,那就算是吧。真正的闭包是下面这个
//闭包(closure)就是封闭的意思
//闭包的概念,闭包概念有很多,我觉得比较好理解的的是松本行弘给的定义:将局部变量这一环境封闭起来的结构,叫做闭包
func count()->(()->Int){
    var i = 0;
    return {
        ()->Int in
        return ++i
    }
}
//测试使用
var touch = count()
touch()//1
touch()//2
touch()//3
touch()//4

异常处理

enum AwfulError: ErrorType {
    case Bad
    case Worse
    case Terrible
}

func hello () throws{
    throw AwfulError.Bad
}

do {
    try hello()
    print("final")
}
catch AwfulError.Bad {
    print("Bad")
}
catch AwfulError.Worse {
    print("Worse")
}
catch AwfulError.Terrible {
    print("Terrible")
}
catch  {
    print("all error")
}

断言

assert(assert(<condition:Bool Bool>)
assert(<condition: Bool Bool>, <message: String String>)
assertionFailure()
assertionFailure(<message: String String>)

typealias

这个关键字可以给类,结构,枚举等增加别名,也常常用于合并协议后的别名 typealias PetLike = protocol<KittenLike, DogLike>

编译标记

//MARK : //MARK -: // TODO: // FIXME:

Selector

objc里面有@Selector(),在swift可以使用 let someMethod = Selector(“someMethodName”)得到。大多数情况无需这样


    func callMe() {
        NSLog("this is callMe")
    }

    func callMeWithParam(timer:NSTimer) {
       NSLog("this is callMeWithParam,prarm is :\(timer.userInfo as! String)")
    }

    //无参数
    NSTimer.scheduledTimerWithTimeInterval(2, target:self, selector:"callMe", userInfo: nil, repeats: true)
    //带参数,不使用Selector
    NSTimer.scheduledTimerWithTimeInterval(2, target:self, selector: "callMeWithParam:", userInfo: "i'm prarm", repeats: true)

扩展

extension Person{
    func anotherHello(){
        NSLog("another hello")
    }
}

OptionSetType

OptionSetType是NSOption在swift的替代


public struct UIViewAutoresizing : OptionSetType {
    public init(rawValue: UInt)
    public static var None: UIViewAutoresizing { get }
    public static var FlexibleLeftMargin: UIViewAutoresizing { get }
    public static var FlexibleWidth: UIViewAutoresizing { get }
    public static var FlexibleRightMargin: UIViewAutoresizing { get }
    public static var FlexibleTopMargin: UIViewAutoresizing { get }
    public static var FlexibleHeight: UIViewAutoresizing { get }
    public static var FlexibleBottomMargin: UIViewAutoresizing { get }
}

//使用,选择多个
[FlexibleLeftMargin,FlexibleWidth]


(三)高级

柯里化 (Currying)

柯里化是一种量产类似方法的好办法,可以通过柯里化一个方法模板来避免写出很多重复代码

func addTwoNumbers(a: Int)(num: Int) -> Int {
    return a + num
}
let addToFour = addTwoNumbers(4)    // addToFour 是一个 Int -> Int
let result = addToFour(num: 6)      // result = 10

封装局部变量

封装局部变量可以减少变量之间的冲突

var str:String = {
    //局部变量被封装
    let str1 = "hello",str2 = "world"
    return "\(str1) \(str2) !"
}()

方法调用的另一种方式


class Person {

    //普通方法
    func hi(name:String) -> String{
        return "hi \(name)"
    }

    //静态方法
    class func hello(){
        NSLog("hello")
    }
}

let person = Person()

//常规方法调用
person.hi("liuyanwei")
Person.hello()

//利用方法名调用
let funcOnPerson1 = Person.hi
funcOnPerson1(person)("liuyanwei")

//调用静态方法
let funcOnPerson2 = Person.hello
funcOnPerson2()

swift单例标准写法


class MyManager  {
    static private let sharedInstance = MyManager()
    class var sharedManager : MyManager {
        return sharedInstance
    }
}

最后

此速记已经收录在ios-tips中。

ios-tips是ios开发当中常用遇到的问题和解决方法的收集,包括ios和swif。 一共包括4个部分

  • 0_Foundation
  • 1_UIKit
  • 2_ThirdParty
  • 3_Other

目前已经整理完0_Foundation,开始整理UIKit。也欢迎大家给ios-tips补充内容。

补充要求

  1. 格式是md
  2. tips都很简短,不要涉及复杂的原理和方法

感谢收看,如果对大家有帮助,请github上follow和star,本文发布在刘彦玮的技术博客,转载请注明出处

===========

参考文章:

  1. The Swift Programming Language
  2. swifter
Loading Disqus comments...
Table of Contents