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")
    }
}

defer

defer{} 可以将大括号中的代码段延迟到它所在的作用于结束后在执行

    print("1-1")
    defer{
      print("1-2")
    }
    print("1-3")

    输出:
        1-1
        1-3
        1-2

Guard

guard充当了警卫员一职,保证条件满足情况下,才会让你通过,否则只能else让你返回了!切记else中一定需要有返回的语句,比如return、continue、break、throw这种提早退出的关键字


  // 这里使用if 和 guard进行对比 你会懂的更多
  if age < 13 {
      return  //当年龄小于13时 程序返回 不进行之后的操作
  }

  guard age >= 13 else{
    return
  }

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
    }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • Swift2.0 1.defer译为延缓、推迟之意类似栈 注意作用域,其次是调用顺序——即一个作用域结束(注意),...
    zeqinjie阅读 3,367评论 0 50
  • 1、随机数 不需要随机数种子 arc4random()%N + begin:产生begin~begin+N的随机数...
    我是小胡胡分胡阅读 4,136评论 0 2
  • Hello Word 在屏幕上打印“Hello, world”,可以用一行代码实现: 你不需要为了输入输出或者字符...
    restkuan阅读 3,151评论 0 5
  • 一直没有时间好好看一下swift,最近复习了一遍语法,这里记录swift学习过程中遇到的一些问题和要点,和Obje...
    bomo阅读 2,332评论 0 25
  • 1、范型范型所解决的问题 函数、方法、类型:类,结构体,枚举,元组类型,协议参数,返回值,成员函数参数,成员属性类...
    我是小胡胡分胡阅读 816评论 0 1