Swift 初見

可選值
如果一個值可能為nil,那么這個值就是可選類型荆秦,用?標(biāo)識

    var a1 : String?
    a1 = "可選類型"

可選類型不能直接使用背捌,必須進(jìn)行強(qiáng)制解包 用!強(qiáng)制解包戳粒,對nil強(qiáng)制解包會早成崩潰

    print(a1!)
    print(a1 ?? "強(qiáng)制解包颖侄,如果為nil,雙引號內(nèi)是默認(rèn)值")

if let對可選值進(jìn)行有值綁定

if let image = UIImage(contentsOfFile: "MyImage.png") {
        // loaded the image successfully
    } else {
        
        // could not load the image
    }

可變與不可變
let var

let maximumNumberOfLoginAttempts = 10
var currentLoginAttempt = 0

指明類型

let name: String = "我是名字內(nèi)容"

布爾值:在Swift中的bool值是truefalse享郊,而不是OC中的YES和NO

let onSaleInferred = true
let onSaleExplicit: Bool = false

打印輸出:在Swift中的打印輸出使用的是print览祖,也可以兼容使用NSlog

    print(10)
    //將值轉(zhuǎn)化為字符串,需要將值寫在括號中并在前面加上斜杠”\”
    print("this is \(10)")
    
    //格式化打印
    print(String.init(format: "%@ %@ %.2f", "asd","dd",10.123))
    print("this is \(String.init(format: "%@ %@ %.2f", "asd","dd",10.123))")
    // 也可以使用
    NSLog("this is %@ %.f", "asd","1.12")

字符串

    var emptyString = ""  // 空字符串字面量
    var anotherEmptyString = String()  // 初始化方法
     // 其它的初始化方法…
    
    判斷是否為空
    if emptyString.isEmpty {
        print("Nothing to see here")
    }
    
    // 字符串拼接的拼接可以使用”+”來完成
    let string1 = "hello"
    let string2 = " there"
    var welcome = string1 + string2

數(shù)組

//創(chuàng)建數(shù)組
    var shoppingList: [String] = ["Eggs", "Milk"]
    shoppingList[0...1] = ["Bananas", "Apples"]
    
    //判斷數(shù)組是否為空
    if shoppingList.isEmpty{
        print("kong")
    }else{
        print("feikong")
    }
    //添加數(shù)據(jù)
    shoppingList += ["haha"]//添加數(shù)據(jù)
    //遍歷
    for item in shoppingList{
        print(item)
    }
    
    for (index, value) in shoppingList.enumerated() {
        print("Item \(String(index + 1)): \(value)")
    }
    
    // 包含任意類型的數(shù)組
    var array2: [Any] = [Any]()
    array2.append(1)
    array2.append(2.0)
    array2.append([3,4])
    array2.append("asdasd")
    array2.append(["key1":"value1","key2":"value2"])
    array2.append(sunClass2)
    
    for iterm in array2{
        print("this is \(iterm)")
    }
    Any:可以表示任何類型炊琉,包括函數(shù)類型
    AnyObject:可以表示任何類類型的實例

字典

// 字典的創(chuàng)建
    var airports: [String: String] = ["key1": "value1", "key2": "value2"]
    
    //字典中某個value的訪問
    let theValue = airports["key1"]
    print(theValue ?? "你打印了一個空字符串")
    
    //增加
    airports["key3"] = "value3"
    //更新
    airports.updateValue("value22222222", forKey: "key2")
    //刪除
    airports.removeValue(forKey: "key1")

屬性的寫法

class Shape {
    var name = "shape"
var string:String{
        set{

        }
        get{
          return "string"
        }
}

}

Swift中的只讀屬性

var redOnly:String{
get{
    return "asd"
}

}//get 和括號都可以去掉

默認(rèn)strong nonatomic展蒂, 用weak申明

class Shape {
    var name = "shape"
weak var delegate: UITextFieldDelegate? 

}

對外readonly對內(nèi)readwrite

private(set) var property: Int

定義類變量
通過static定義的類變量無法在子類重寫,通過class定義的類變量則可在子類重寫。

class Aclass {
    static var storedTypeProperty = "Some value."
    static var computedTypeProperty: Int {
        return 1
    }
    class var overrideableComputedTypeProperty: Int {
        return 107
    }
}

解決閉包中循環(huán)引用
[unowned 捕獲對象]或者 [weak 捕獲對象]

__weak typeof(self) weakSelf = self;
    
    self.block = ^{
        
        __strong typeof(self) strongSelf = weakSelf;
        
        [strongSelf doSomething];
        
    };
    self.closure = { [unowned self] in
        
        self.doSomething()
        
    }

類型判斷
is關(guān)鍵詞
相當(dāng)于OC的isKindofClass:

單例寫法

class singletonClass {
    static let sharedInstance = singletonClass()
    private init() {} // 這就阻止其他對象使用這個類的默認(rèn)的'()'初始化方法
}

lazy寫法

class ClassA {
    lazy var str: String = {
        let str = "Hello"
        print("只在首次訪問輸出")
        return str
    }()
}

if寫法語句里的條件不再需要使用()包裹了苔咪。Swift里沒有OC的非零即真的說法锰悼,判斷條件要明確

let number = 23
if number < 10 {
    print("The number is small")
} 

for寫法

for index in 1...5 {
    print(index)
}

區(qū)間運(yùn)算符
?閉區(qū)間[a,b]-------> a...b?前閉后開區(qū)間[a,b)------->a..<b
閉區(qū)間運(yùn)算符(a...b)定義一個包含從a到b(包括a和b)的所有值的區(qū)間
半閉區(qū)間(a..b)定義一個從a到b但不包括b的區(qū)間。 之所以稱為半閉區(qū)間团赏,是因為該區(qū)間包含第一個值而不包括最后的值箕般。
元組遍歷字典

let dictionary = ["firstName":"Mango","lastName":"Fang"]
for (key,value) in dictionary{
    print(key+" "+value)
}

SWitch寫法,無需breadk
下面這兩種寫法是等價的舔清。

let character = "a"

switch character{
    case "a":
        print("A")
    break
    case "b":
        print("B")
    break
default: print("character")
let character = "a"

switch character{
    case "a":
        print("A")
    case "b":
        print("B")
default: print("character")

SWitch并列處理

switch some value to consider {
case value 1,value 2:
    statements
}

在OC中,Swtich只支持int類型,char類型作為匹配丝里。

if ([cardName isEqualToString:@"Six"]) {
    [self setValue:6];
} else if ([cardName isEqualToString:@"Seven"]) {
    [self setValue:7];
} else if ([cardName isEqualToString:@"Eight"]) {
    [self setValue:8];
} else if ([cardName isEqualToString:@"Nine"]) {
    [self setValue:9];
} 
switch carName{
    case "Six":
        self.vaule = 6
    case "Seven":
        self.vaule = 7
    case "Eight":
        self.vaule = 8
    case "Night":
        self.vaule = 9   
}

函數(shù)(類方法與實例方法)寫法
1. 通過func關(guān)鍵詞定義函數(shù)
2. 返回值在->關(guān)鍵詞后標(biāo)注

class func blackColor() -> UIColor //類方法, 通過 class func 關(guān)鍵詞聲明
func addSubview(_ view: UIView)//實例方法
如果你調(diào)用的方法是沒有參數(shù)的,調(diào)用時也得加上在點(diǎn)方法后也得加上括號
myTableView.layoutIfNeeded()

協(xié)議

protocol SampleProtocol 
{
    func someMethod()
}
class AnotherClass: SomeSuperClass, SampleProtocol
{
    func someMethod() {}
}

代理寫法 weak

protocol MyDelegate : class {
}

class MyClass {
    weak var delegate : MyDelegate?
}

檢測代理更優(yōu)雅
以前我們要在Objective-C這樣檢查:

 if (self.dataSource && [self.dataSource respondsToSelector:@selector(titleForSegmentAtIndex:)]) {
        thisSegmentTitle = [self.dataSource titleForSegmentAtIndex:index];
    }

在Swift中,非常的優(yōu)雅簡潔体谒。

if let thisSementTitle = dataSource?.titleFroSegmentAtIndex?(index){
}

在Swift中,protocol變得更加強(qiáng)大,靈活:
class,enum,structure都可以遵守協(xié)議蒲牧。Extension也能遵守協(xié)議秽之。利用它,我們不需要繼承,也能夠讓系統(tǒng)的類也遵循我們的協(xié)議。例如:

protocol myProtocol {func hello() -> String}
extension String: myProtocol{
        func hello() -> String {
                return "hello world!"
        }
}

擴(kuò)展(Extension),相對于OC來說沒有名字

extension SomeType {
    func hello(){}
}

idAnyObject
在Swift中,沒有id類型,Swift用一個名字叫AnyObject的protocol來代表任意類型的對象掰曾。

 id myObject = [[UITableViewCell alloc]init];
 var myObject: AnyObject = UITableViewCell()

我們知道id的類型直到運(yùn)行時才能被確定,如果我們向一個對象發(fā)送一條不能響應(yīng)的消息,就會導(dǎo)致crash尽超。
我們可以利用Swift的語法特性來防止這樣的錯誤:
myObject.method?()
如果myObject沒有這個方法,就不會執(zhí)行,類似檢查delegate是否有實現(xiàn)代理方法席里。
在Swift中,在AnyObject上獲取的property都是optional的宏蛉。
閉包
OC中的block在Swift中無縫地轉(zhuǎn)換為閉包肯污。函數(shù)實際上也是一種特殊的閉包。

void (^completionBlock)(NSData *) = ^(NSData *data) {
        
        // ...
        
    }
    let completionBlock: (Data) -> Void = { data in
        
        // ...
        
    }

錯誤處理
OC寫法

NSFileManager *fileManager = [NSFileManager defaultManager];
NSURL *URL = [NSURL fileURLWithPath:@"/path/to/file"];
NSError *error = nil;
BOOL success = [fileManager removeItemAtURL:URL error:&error];
if (!success) {
        
    NSLog(@"Error: %@", error.domain);
}

Swift寫法

let fileManager = FileManager.default
let URL = NSURL.fileURL(withPath: "/path/to/file")
do {

   try fileManager.removeItem(at: URL)
} catch let error as NSError {
        
   print("Error: \(error.domain)")
}

尾隨閉包簡寫
func someFunctionThatTakesAClosure(closure: () -> Void) {
    // 函數(shù)體部分
}

//不使用尾隨閉包進(jìn)行函數(shù)調(diào)用
someFunctionThatTakesAClosure(closure: {
    // 閉包主體部分
})

//使用尾隨閉包進(jìn)行函數(shù)調(diào)用
someFunctionThatTakesAClosure() {
    // 閉包主體部分
}

泛型運(yùn)用

static func httpPost<T:CKKBaseModel>(url: String, pamas: [String: AnyObject]? = nil, success:((T) -> Void)? = nil, successList:((Array<T>) -> Void)? = nil, failure:((String) -> Void)? = nil) {
    }

混編注意
寫Swift類可以繼承自O(shè)C類彩届,但是如果要寫一個OC類就不能繼承自 Swift 類伪冰。
為了在 Objective-C 中可以訪問并使用,Swift 類必須是一個 Objective-C 類的子類惨缆,或者被標(biāo)記為@objc糜值。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市坯墨,隨后出現(xiàn)的幾起案子寂汇,更是在濱河造成了極大的恐慌,老刑警劉巖捣染,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件骄瓣,死亡現(xiàn)場離奇詭異,居然都是意外死亡耍攘,警方通過查閱死者的電腦和手機(jī)榕栏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蕾各,“玉大人扒磁,你說我怎么就攤上這事∈角” “怎么了妨托?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長吝羞。 經(jīng)常有香客問我兰伤,道長,這世上最難降的妖魔是什么钧排? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任敦腔,我火速辦了婚禮,結(jié)果婚禮上恨溜,老公的妹妹穿的比我還像新娘符衔。我一直安慰自己,他們只是感情好糟袁,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布柏腻。 她就那樣靜靜地躺著,像睡著了一般系吭。 火紅的嫁衣襯著肌膚如雪五嫂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天肯尺,我揣著相機(jī)與錄音沃缘,去河邊找鬼。 笑死则吟,一個胖子當(dāng)著我的面吹牛槐臀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播氓仲,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼水慨,長吁一口氣:“原來是場噩夢啊……” “哼得糜!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起晰洒,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤朝抖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后谍珊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體治宣,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年砌滞,在試婚紗的時候發(fā)現(xiàn)自己被綠了侮邀。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡贝润,死狀恐怖绊茧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情打掘,我是刑警寧澤按傅,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站胧卤,受9級特大地震影響唯绍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜枝誊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一况芒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧叶撒,春花似錦绝骚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至古瓤,卻和暖如春止剖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背落君。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工穿香, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人绎速。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓皮获,卻偏偏與公主長得像,于是被迫代替她去往敵國和親纹冤。 傳聞我的和親對象是個殘疾皇子洒宝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評論 2 348

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