Swift3.0 - 數(shù)據(jù)類型

Swift3.0 - 真的很簡單
Swift3.0 - 數(shù)據(jù)類型
Swift3.0 - Array
Swift3.0 - 字典
Swift3.0 - 可選值
Swift3.0 - 集合
Swift3.0 - 流控制
Swift3.0 - 對象和類
Swift3.0 - 屬性
Swift3.0 - 函數(shù)和閉包
Swift3.0 - 初始化和釋放
Swift3.0 - 協(xié)議protocol
Swift3.0 - 類和結(jié)構(gòu)體的區(qū)別
Swift3.0 - 枚舉
Swift3.0 - 擴展
Swift3.0 - 下標
Swift3.0 - 泛型
Swift3.0 - 異常錯誤
Swift3.0 - 斷言
Swift3.0 - 自動引用計數(shù)(strong,weak,unowned)
Swift3.0 - 檢測API
Swift3.0 - 對象的標識
Swift3.0 - 注釋
Swift3.0 - 元類型
Swift3.0 - 空間命名
Swift3.0 - 對象判等
Swift3.0 - 探究Self的用途
Swift3.0 - 類簇
Swift3.0 - 動態(tài)調(diào)用對象(實例)方法
Swift3.0 - 文本輸出
Swift3.0 - 黑魔法swizzle
Swift3.0 - 鏡像
Swift3.0 - 遇到的坑

  • 常量定義
let myConstant = 42
let myConstant:Int = 42  // 指定類型定義
let name = "酷走天涯"     // 類型推斷定義
var red, green, blue: Double  //單行定義多個變量
let cat = "??"; print(cat)   // 如果有笼吟;單行可以寫多個語句
let binaryInteger = 0b10001 //2進制數(shù)字的定義
let octalInteger = 0o21    // 八進制數(shù)字的定義
let hexadecimalInteger = 0x11  //16進制數(shù)字的定義
let exponentDouble = 1.21875e1 // 科學(xué)技術(shù)法定義
let hexadecimalDouble = 0xC.3p0 // 16進制科學(xué)技術(shù)法定義
let oneMillion = 1_000_000 // 可以使用_線將數(shù)字分開,便于認知
  • 變量定義
var myVariable = 42
  • 類型轉(zhuǎn)換
let str = "\(num1)"
let str1 = String(num1)
let num2 = Int(num1)
let num3 = Int(str1)
let num4 = Double(str1)
  • 數(shù)組的幾種定義方式
let list1 = ["你好","2","3","4"]
let list2:[String] = ["你好","2","3","4"]
let list3:[Any] = ["你好","2","3",3,UILabel()]
let list4:NSArray =  ["你好","2","3","4",UILabel()]
let list5:NSMutableArray =  ["1","2","3","4"]
// 清空數(shù)組
list2.removeAll() //  如果定義為var
list2 = [] // 如果定義為var
list5.removeAllObjects() // var 和let 都可以
list5 = [] // 如果定義為var
// 取代操作
shoppingList[4...6] = ["Bananas", "Apples"] // 將數(shù)組4...6 的范圍用指定的數(shù)組取代

// 插入操作
shoppingList.insert("Maple Syrup", at: 0)

  • 字典
let dic1:[String:Int] = [:]
let dic2 = [String:Int]()
let dic3 :NSDictionary = NSDictionary()
let dic4:NSMutableDictionary = [:]
  • 獲取數(shù)據(jù)類型的最大和最小值
let minValue = UInt8.min
let maxValue = UInt8.max
  • 給數(shù)據(jù)類型設(shè)置別名
typealias  Code = Int32 // 給Int32 設(shè)置個別名
var tel:Code = 376823
  • 元組類型

    a.定義

 // 第一種定義方法
 let http404Error = (404, "Not Found") // 定義元組類型的常量
 let code = http404Error.0
 let error = http404Error.1
 // 第二種定義方法
let http404Error = (code:404, error:"Not Found") // 定義元組類型的常量
let code = http404Error.code
let error = http404Error.error
也可以像上面一個獲取對應(yīng)的數(shù)據(jù)
// 第三種定義方法
let http404Error:(code:Int,error:String) = (404, "Not Found")  // 定義元組類型的常量
let code = http404Error.code
let error = http404Error.1
// 第四種定義方法
let http404Error:(code:Int,error:String) = (code:404, error:"Not     Found")  // 定義元組類型的常量
let code = http404Error.code
let error = http404Error.error
// 第五種定義方式
var http404Error:(code:Int,error:String) = (_:404, _:"Not Found")

提示:

第四種定義的時候,等號坐標和右邊的元素名稱必須對應(yīng),不然系統(tǒng)會報錯,建議不使用這種方式定義

2.分解變量

let (statusCode, _) = http404Error// 缺省不需要的值
let (statusCode, statusMessage) = http404Error

3.賦值

var http404Error:(code:Int,error:String)
http404Error = (code:404,error:"Not Found")// 完整
http404Error = (404,error:"Not Found") // 部分名稱缺省
http404Error = (404,"Not Found")// 全部名稱缺省
http404Error = (_:404,"Not Found") // 可以使用_代替名稱
http404Error = (code1:404,"Not Found") // 不允許這樣必須,名稱必需和定義時保持一致
  • 字符串和字符
let string = "hello, " + "world" // Swift中 終于可以這么方便處理字符串的拼接了
name.append("你好")  // 也可以這樣拼接 name必須為var
var anotherEmptyString = String()// 定義空字符串
// 判斷字符串是否為空
if emptyString.isEmpty { 
 print("Nothing to see here")
}
// 獲取字符串中每個字符
for character in "Dog!??".characters {
print(character)
}
for index in greeting.characters.indices {
  print("\(greeting[index]) ", terminator: "")
}
// 定義字符
let exclamationMark: Character = "!"
// 定義字符數(shù)組
let catCharacters: [Character] = ["C", "a", "t", "!", "??"]
// 字符數(shù)組轉(zhuǎn)字符串
let catString = String(catCharacters)
// Unicode編碼
let precomposed: Character = "\u{D55C}"                  // ?
let regionalIndicatorForUS: Character = "\u{1F1FA}\u{1F1F8}" //????
var name = "??a我" 
print(name.characters.count) // 3 一個不管是什么都算一個字符
// 截取字符串
let greeting = "Guten Tag!"
// 截取單個
greeting[greeting.startIndex] 
// 截取一段
greeting[greeting.index(greeting.startIndex, offsetBy: 2)..<greeting.index(greeting.endIndex, offsetBy: -3)]
// 在指定位置插入字符串
welcome.insert("!", at: welcome.endIndex)
welcome.insert(contentsOf:" there".characters, at: welcome.index(before: welcome.endIndex))
// 移除字符串
 welcome.remove(at: welcome.index(before: welcome.endIndex))
 let range = welcome.index(welcome.endIndex, offsetBy: -6)..<welcome.endIndex
  welcome.removeSubrange(range)
 // 前綴和后綴
 if scene.hasSuffix("Capulet's mansion"){
 } // hasPrefix(_:)
 // 獲取對應(yīng)的編碼數(shù)據(jù)
 for codeUnit in dogString.utf16 {
     print("\(codeUnit) ", terminator: "")
 }

深入

  • 擴展
extension Int{
  func description()-> String{
     return "我是一個Int類型的數(shù)字\(self)"
  }
}
print(3.description())

運行:

我是一個Int類型的數(shù)字3

  • 協(xié)議擴展的好處1
 // 定義個協(xié)議
protocol NumberProtocol{
    func description()-> String
}
// 擴展實現(xiàn)協(xié)議
extension Int:NumberProtocol{
    func description()-> String{
       return "我是一個Int類型的數(shù)字\(self)"
    }
}
extension Double:NumberProtocol{
    func description()-> String{
        return "我是一個Double類型的數(shù)字\(self)"
  }
}

// 定義一個協(xié)議類型
var a:NumberProtocol = 3
print(a.description())
a = 3.4
print(a.description())

運行:

我是一個Int類型的數(shù)字3
我是一個Double類型的數(shù)字3.4

通過這種方法,我們可以給同一個變量,賦值不同類型的值了,其實這個符合swift的語法要求,只是我們利用它的靈活性,達到了我們的目的

  • 協(xié)議好處2

需求

給Int 類型和 Double類型增加一個方法,判斷它的數(shù)據(jù)類型

// 定義個協(xié)議
protocol NumberProtocol{
}

// 擴展實現(xiàn)協(xié)議
extension Int:NumberProtocol{
}

extension Double:NumberProtocol{
}
// 給協(xié)議擴展方法
extension NumberProtocol{
    func description()-> String{
        if self is Int{
            return "我是一個Int類型的數(shù)字\(self)"
        }
        if self is Double{
             return "我是一個Double類型的數(shù)字\(self)"
        }
        return "我既不是Int也不是Double類型的數(shù)字\(self)"
    }
}
print(3.44.description())
print(3.description())

運行:

我是一個Double類型的數(shù)字3.44
我是一個Int類型的數(shù)字3

  • Self 的好處

專門用于不確定數(shù)據(jù)類型的

需求:給所有數(shù)字類型,擴展一個平方的函數(shù),返回自己的操作

// 定義個協(xié)議
protocol NumberProtocol{
}
// 擴展實現(xiàn)協(xié)議
extension Int:NumberProtocol{
}
extension Double:NumberProtocol{
}
// 給協(xié)議擴展方法
extension NumberProtocol{
    // 我們不確定返回的Self 到底是什么類型
    func squareValue()-> Self{
    if self is Int{
        let n = self as! Int
        return n * n as! Self
    }
    if self is Double{
        let n = self as! Double
        return n * n as! Self
    }
    return 0 as! Self
}
}
print(3.44.squareValue())
print(3.squareValue())

運行:

11.8336
9

結(jié)論

我只想說這個用法只是Self的冰山一角更多神奇的東西,等待我們?nèi)ヌ剿鳌?/p>


你需要注意的

  1. 如果指出變量的類型,賦值的值必須是和他類型相同的值,不然編譯不通過
    var num:Int = 43.0//(編譯錯誤)

2.浮點數(shù)類型推斷出來的默認為Double類型

  let name = 30.0 // Double

3.Float 類型的值 賦值給Double類型也必須轉(zhuǎn)換

let name:Float = 30.0
let explicitDouble: Double = Double(name)

4.數(shù)字之間的轉(zhuǎn)換結(jié)果為非可選值,數(shù)字轉(zhuǎn)字符串也是非可選值,但是字符串轉(zhuǎn)數(shù)字就是可選值(因為它有可能轉(zhuǎn)換失敗)

let str = "\(num1)"
let str1 = String(num1)
let num2 = Int(num1)
let num3 = Int(str1)
let num4 = Double(str1)

輸出結(jié)果:

30.0
30
nil
Optional(30.0)

注意:

字符串33.0 轉(zhuǎn)Int 類型只會是nil 不會是33 因為字符串33.0 不是Int類型轉(zhuǎn)換失敗,但是浮點數(shù)33.0 可以轉(zhuǎn)換為33

5.不能推斷出下面的類型

 let list1 = ["你好","2","3",3] // 不能這樣寫,swift推斷不出來

你應(yīng)該:

let list1 = ["你好","2","3",3] as [Any]
let list1:[Any] = ["你好","2","3",3]
let list1:NSArray = ["你好","2","3",3]
let list1:NSMutableArray = ["你好","2","3",3]

6.使用Dictionary定義字典必須指定數(shù)據(jù)類型

let dic5:Dictionary = [:] // 錯誤
let dic5:Dictionary = [String:Int]() // 正確

無聊的測試

  • 類型推斷對性能的影響
  for i in 0...50000000{
    let i = 10;
  }

運行三次消耗時間:

4.58978801965714
4.41006201505661
4.87126302719116

for i in 0...50000000{
    let i:Int = 10;
}

運行三次消耗時間

4.42452102899551
4.68995898962021
4.52677303552628

類型推斷對性能沒有影響

  • Array 和NSArray,NSMutableArray的區(qū)別

1.測試類型

var list1:Array = ["你好","2","3","4"]
let list2 = list1
list1[1] = "哈哈"
print(list1)
print(list2)

運行結(jié)果:

["你好", "哈哈", "3", "4"]
["你好", "2", "3", "4"]

var list1:NSMutableArray = ["你好","2","3","4"]
let list2 = list1

list1[1]="哈哈"
print(list1)
print(list2)

運行結(jié)果:

("你好", "哈哈", "3", "4")
("你好", "哈哈", "3", "4")

結(jié)論:

Array 為值類型,NSArray,NSMutableArray為引用類型

2.測試內(nèi)存占用

func add(){
    var array: [Any] = [3]
    for _ in 0...10000000{
        array.append(3)
    }
}

執(zhí)行代碼前 3.5M 執(zhí)行代碼后 3.8 M 內(nèi)存占用最高 308.6M

func add(){
    let array: NSMutableArray = NSMutableArray()
    for i in 0...10000000{
        array.add(3)
        if i == 10000000{
            
        }
        
    }
}

執(zhí)行代碼前3.5 M ,代碼執(zhí)行完畢后 17.3M,內(nèi)存占用最高為 422.3

3.我們使用Array 放對象

    func add(){
    var array: [Any] = []
    for i in 0...10000{
        array.append([UILabel()])
    }
}

運行前 3.5 運行后10.5 最高占內(nèi)存 21.5巷燥,發(fā)現(xiàn)內(nèi)存沒有釋放完畢

嘗試修改代碼如下:

 autoreleasepool {
        var array: [Any] = []
        for i in 0...10000{
            array.append([UILabel()])
        }
    }

運行結(jié)果依舊

結(jié)論:

Swift 中新增的Array 存放非對象類型,內(nèi)存清理的更及時,更徹底!

4.數(shù)據(jù)的上溢或者下溢系統(tǒng)都會報錯

Int8.min - 1
Int8.max + 1

報錯:

arithmetic operation '127 + 1' (on type 'Int8') results in an overflow
error: arithmetic operation '-128 - 1' (on type 'Int8') results in an overflow

5.浮點數(shù)取余運算

let z =  CGFloat(23.4).truncatingRemainder(dividingBy: 20)

運行:

3.4

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蜓竹,一起剝皮案震驚了整個濱河市市咆,隨后出現(xiàn)的幾起案子荣赶,更是在濱河造成了極大的恐慌每币,老刑警劉巖力麸,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拐辽,死亡現(xiàn)場離奇詭異磁滚,居然都是意外死亡佛吓,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門垂攘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來维雇,“玉大人,你說我怎么就攤上這事晒他≈ㄐ停” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵陨仅,是天一觀的道長津滞。 經(jīng)常有香客問我,道長灼伤,這世上最難降的妖魔是什么触徐? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮饺蔑,結(jié)果婚禮上锌介,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好孔祸,可當(dāng)我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布隆敢。 她就那樣靜靜地躺著,像睡著了一般崔慧。 火紅的嫁衣襯著肌膚如雪拂蝎。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天惶室,我揣著相機與錄音温自,去河邊找鬼。 笑死皇钞,一個胖子當(dāng)著我的面吹牛悼泌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播夹界,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼馆里,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了可柿?” 一聲冷哼從身側(cè)響起鸠踪,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎复斥,沒想到半個月后营密,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡目锭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年评汰,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片侣集。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡键俱,死狀恐怖兰绣,靈堂內(nèi)的尸體忽然破棺而出世分,到底是詐尸還是另有隱情,我是刑警寧澤缀辩,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布臭埋,位于F島的核電站,受9級特大地震影響臀玄,放射性物質(zhì)發(fā)生泄漏瓢阴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一健无、第九天 我趴在偏房一處隱蔽的房頂上張望荣恐。 院中可真熱鬧,春花似錦、人聲如沸叠穆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽硼被。三九已至示损,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間嚷硫,已是汗流浹背检访。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留仔掸,地道東北人脆贵。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像起暮,于是被迫代替她去往敵國和親丹禀。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,435評論 2 359

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

  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young閱讀 3,817評論 1 10
  • 學(xué)無止境 keep moving 定義基本數(shù)據(jù)格式 變量定義 類型轉(zhuǎn)換 數(shù)組的定義方式 字典的定義方式 獲取數(shù)據(jù)類...
    元昊閱讀 489評論 0 0
  • 類型介紹Swift3.0數(shù)據(jù)類型:整形/浮點型/對象類型/結(jié)構(gòu)體類型等等 整型Swift 提供了8鞋怀,16双泪,32和6...
    ibabyblue閱讀 603評論 2 0
  • 蓬萊的風(fēng)。蓬萊的雨密似,還有走在蓬萊路上的你
    pp萍萍閱讀 197評論 0 0
  • 放棄既定行程焙矛,趕往同學(xué)的婚禮,希望找回愛的勇氣残腌。祝愿自己一切都好村斟,祝愿自己給予自己力量和勇氣,靠自己抛猫。
    windy1980閱讀 111評論 0 0