swift 快速記憶

(一)類型

常見類型

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

//typle 元組類型
//聲明
let someTuple:(Int,Int) = (10,23)
//元組可以設(shè)置名稱
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
//類型的別名關(guān)鍵字

//函數(shù)類型
func

//可選類型
var num:Int? = nil
var num1:Optional<Int> = nil

//隱式解析可選
var num:Int!
var num1:ImplicitlyUnwrappedOptional<Int>

//協(xié)議合成類型
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("元素下標(biāo):\(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"]

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


枚舉enum


//整形的枚舉
enum Sharp:Int{
    case Rect=1,Circle,Star
    //switch中的選項(xiàng)可以用.表示
    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)
//調(diào)用枚舉的方法
Sharp.Rect.desc()

結(jié)構(gòu)struct

//結(jié)構(gòu)
//結(jié)構(gòu)和類的最重要的區(qū)別就是架構(gòu)是傳值设塔,類是傳引用
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
    }
}

協(xié)議


//可以被class茉贡,struct眯牧,enum實(shí)現(xiàn)
protocol Sharp{
    //屬性
    var width:String{get}
    var heiht:String{get set}
    //方法
    func area()->Int
    
}

//swift 可選和必選協(xié)議
//只能被class實(shí)現(xiàn)觅彰,無(wú)法給struct和enum實(shí)現(xiàn)
@objc protocol OptionalProtocol {
    //可選協(xié)議
    optional func optionalMethod()
    //必選協(xié)議
    func necessaryMethod()
}

對(duì)象

class Card: NSObject {
    
}
class Person: NSObject {

    //私有對(duì)象
    private var _name:String?
    
    var gender:String
    var gender1:String?
    
    //arc
    /*
    weak 用于可空對(duì)象鳍侣,unowned用于非空對(duì)象
    weak 調(diào)用被釋放的對(duì)象會(huì)返回nil抡医,unowned 調(diào)用被釋放的對(duì)象會(huì)出異常
    建議 如果能夠確定在訪問(wèn)時(shí)不會(huì)已被釋放的話英融,盡量使用 unowned癣防,如果存在被釋放的可能趴俘,那就選擇用 weak
    */
    weak var bastFriend:Person?
    unowned var identityCard:Card
    

    //構(gòu)造函數(shù)
    init(name: String) {
        gender = "male"
        identityCard = Card()
        super.init()
        //初始化睹簇。。寥闪。
        self.name = name
    }
    //便利構(gòu)造函數(shù)
    convenience init(name:String,gender:String)
    {
        self.init(name:name)
        self.gender = gender
    }
    
    //析構(gòu)函數(shù)
    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")
    }
    
    //靜態(tài)方法
    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"
        }()
    //調(diào)用
    //NSLog("bastFirends:%@ and friends is:[%@] ",p.bastFirends,p.friends)
    
    //下標(biāo)腳本
    subscript(name:String)->String{
        get{
            return self.name
        }
        set{
            self.name = newValue;
        }
    }
    

}

(二)語(yǔ)法

流程控制

if語(yǔ)句


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

switch

//switch 數(shù)字區(qū)間
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")//匹配多個(gè)條件
case let (_,y): print(y); fallthrough // 值綁定,fallthrough 墜落下一個(gè)條件
    case (_,0...100): print("case3");// “_” 匹配所有
    default:break;
}

//switch 值綁定和where語(yǔ)句
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
}

//對(duì)option的判斷
let num: Int? = nil
switch num {
    case nil: println("沒(méi)值")
    default:  println("\(num!)")
}

函數(shù)


//無(wú)參數(shù)
func hello(){}

//有參數(shù)
func hello(name:String){}

//有參數(shù)和返回值
func hello(name:String)->String{}

//多個(gè)參數(shù)
func hello(name:String,age:Int){}
    
//多個(gè)返回值
func hello()->(String,Int){
    return (num1,num2,num3)
}

//可變參數(shù)
func hello(name:String...){}

//函數(shù)的嵌套
func hello1(){
    func hello2(){}
}

//參數(shù)的默認(rèn)值
func hello1(msg:String = "defaultMsg"){}

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


//參數(shù)是函數(shù)
fun hello(msg:String,callback(Void->Void)){
    callback()
}

//函數(shù)參數(shù)是變量
//若不聲明var ,默認(rèn)參數(shù)類型是let疲憋,就無(wú)法修改參數(shù)的值
func hello(var msg:String){
    msg += "hello"
    print(msg)
}

//函數(shù)參數(shù)的命名
func hello(name name:String ,withAge age:Int){}
func hello1(name:String ,age:Int){}
//調(diào)用
hello(name:<String>, withAge:<Int>)//默認(rèn)的參數(shù)命名
hello1(<name:String  String>, age: <Int>)//指定的參數(shù)命名

//匿名函數(shù)
//{}可以作為匿名函數(shù)
//例如調(diào)用上面的hello方法(參數(shù)是函數(shù))
hello("hi",
    {
     //dosthing
    }
)

//有參數(shù)的匿名函數(shù)
{
    (msg:String)->String in
    return msg
}

//泛型參數(shù)
//輸入輸出參數(shù)的函數(shù)
func myswap<T>(inout obj1:T,inout _ obj2:T){
    let temp:T = obj1
    obj1 = obj2
    obj2 = temp
}


閉包


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

//完整寫法
//{ (參數(shù):類型) in 執(zhí)行方法 return 返回值}
array.sort({
    (s1:String,s2:String) -> Bool in
    return s2 > s1;
})

//省略參數(shù)類型和括號(hào)
//{ 參數(shù)$1,$2 in 執(zhí)行方法 return 返回值}
array.sort({
    s1,s2 -> Bool in
    return s1 > s2;
})

//省略參數(shù)類型和return關(guān)鍵字
//{ 參數(shù)$1,$2 in 返回值}
array.sort({
    s1,s2 ->Bool in
    s1 < s2
})

//省略參數(shù)名
array.sort({
    $1 < $0
})

//尾隨閉包
array.sort(){
    $1 < $0
}


//上面的幾個(gè)其實(shí)只是匿名函數(shù)凿渊,不是真正的閉包。swift里面稱他們是閉包缚柳,那就算是吧埃脏。真正的閉包是下面這個(gè)
//閉包(closure)就是封閉的意思
//閉包的概念,閉包概念有很多,我覺(jué)得比較好理解的的是松本行弘給的定義:將局部變量這一環(huán)境封閉起來(lái)的結(jié)構(gòu)秋忙,叫做閉包
func count()->(()->Int){
    var i = 0;
    return {
        ()->Int in
        return ++i
    }
}
//測(cè)試使用
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

這個(gè)關(guān)鍵字可以給類彩掐,結(jié)構(gòu),枚舉等增加別名灰追,也常常用于合并協(xié)議后的別名
typealias PetLike = protocol<KittenLike, DogLike>

編譯標(biāo)記

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

Selector

objc里面有@Selector(),在swift可以使用 let someMethod = Selector("someMethodName")得到堵幽。大多數(shù)情況無(wú)需這樣


    func callMe() {
        NSLog("this is callMe")
    }
    
    func callMeWithParam(timer:NSTimer) {
       NSLog("this is callMeWithParam,prarm is :\(timer.userInfo as! String)")
    }
   
    //無(wú)參數(shù)
    NSTimer.scheduledTimerWithTimeInterval(2, target:self, selector:"callMe", userInfo: nil, repeats: true)
    //帶參數(shù),不使用Selector
    NSTimer.scheduledTimerWithTimeInterval(2, target:self, selector: "callMeWithParam:", userInfo: "i'm prarm", repeats: true)

擴(kuò)展

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

defer

defer{} 可以將大括號(hào)中的代碼段延遲到它所在的作用于結(jié)束后在執(zhí)行

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

    輸出:
        1-1
        1-3
        1-2

Guard

guard充當(dāng)了警衛(wèi)員一職,保證條件滿足情況下弹澎,才會(huì)讓你通過(guò)朴下,否則只能else讓你返回了!切記else中一定需要有返回的語(yǔ)句裁奇,比如return桐猬、continue、break刽肠、throw這種提早退出的關(guān)鍵字


  // 這里使用if 和 guard進(jìn)行對(duì)比 你會(huì)懂的更多
  if age < 13 {
      return  //當(dāng)年齡小于13時(shí) 程序返回 不進(jìn)行之后的操作
  }

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

//使用,選擇多個(gè)
[FlexibleLeftMargin,FlexibleWidth]


(三)高級(jí)

柯里化 (Currying)

柯里化是一種量產(chǎn)類似方法的好辦法溃肪,可以通過(guò)柯里化一個(gè)方法模板來(lái)避免寫出很多重復(fù)代碼

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

封裝局部變量

封裝局部變量可以減少變量之間的沖突

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

方法調(diào)用的另一種方式


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

    //靜態(tài)方法
    class func hello(){
        NSLog("hello")
    }
}

let person = Person()

//常規(guī)方法調(diào)用
person.hi("liuyanwei")
Person.hello()

//利用方法名調(diào)用
let funcOnPerson1 = Person.hi
funcOnPerson1(person)("liuyanwei")

//調(diào)用靜態(tài)方法
let funcOnPerson2 = Person.hello
funcOnPerson2()

swift單例標(biāo)準(zhǔn)寫法


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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末免胃,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子惫撰,更是在濱河造成了極大的恐慌羔沙,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件厨钻,死亡現(xiàn)場(chǎng)離奇詭異扼雏,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)夯膀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門诗充,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人诱建,你說(shuō)我怎么就攤上這事蝴蜓。” “怎么了俺猿?”我有些...
    開封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵茎匠,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我押袍,道長(zhǎng)诵冒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任谊惭,我火速辦了婚禮汽馋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘圈盔。我一直安慰自己惭蟋,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開白布药磺。 她就那樣靜靜地躺著告组,像睡著了一般。 火紅的嫁衣襯著肌膚如雪癌佩。 梳的紋絲不亂的頭發(fā)上木缝,一...
    開封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音围辙,去河邊找鬼我碟。 笑死,一個(gè)胖子當(dāng)著我的面吹牛姚建,可吹牛的內(nèi)容都是我干的矫俺。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼厘托!你這毒婦竟也來(lái)了友雳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤铅匹,失蹤者是張志新(化名)和其女友劉穎押赊,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體包斑,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡流礁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了罗丰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片神帅。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖萌抵,靈堂內(nèi)的尸體忽然破棺而出枕稀,到底是詐尸還是另有隱情,我是刑警寧澤谜嫉,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站凹联,受9級(jí)特大地震影響沐兰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蔽挠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一住闯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧澳淑,春花似錦比原、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至氢拥,卻和暖如春蚌铜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背嫩海。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工冬殃, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人叁怪。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓审葬,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子涣觉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Swift2.0 1.defer譯為延緩痴荐、推遲之意類似棧 注意作用域,其次是調(diào)用順序——即一個(gè)作用域結(jié)束(注意)旨枯,...
    zeqinjie閱讀 3,381評(píng)論 0 50
  • 1蹬昌、隨機(jī)數(shù) 不需要隨機(jī)數(shù)種子 arc4random()%N + begin:產(chǎn)生begin~begin+N的隨機(jī)數(shù)...
    我是小胡胡123閱讀 4,167評(píng)論 0 2
  • Hello Word 在屏幕上打印“Hello, world”,可以用一行代碼實(shí)現(xiàn): 你不需要為了輸入輸出或者字符...
    restkuan閱讀 3,181評(píng)論 0 6
  • 一直沒(méi)有時(shí)間好好看一下swift攀隔,最近復(fù)習(xí)了一遍語(yǔ)法皂贩,這里記錄swift學(xué)習(xí)過(guò)程中遇到的一些問(wèn)題和要點(diǎn),和Obje...
    bomo閱讀 2,353評(píng)論 0 25
  • 1昆汹、范型范型所解決的問(wèn)題 函數(shù)明刷、方法、類型:類满粗,結(jié)構(gòu)體辈末,枚舉,元組類型映皆,協(xié)議參數(shù)挤聘,返回值,成員函數(shù)參數(shù)捅彻,成員屬性類...
    我是小胡胡123閱讀 832評(píng)論 0 1