可選值
如果一個值可能為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值是true
和false
享郊,而不是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(){}
}
id
與AnyObject
在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糜值。