swift4.0的新特性

#1.添加Codable協議,方便自定義數據類型序列化

#2.添加定義多行字符串語法

#3.改進key-value coding的keypath

#4.修改并強化字典功能

#5.字符串變為集合類型

1.Swifty encoding and decoding

在Objective-C中值類型的相互影響是十分糟糕的。比如NSCoding協議,類繼承它之后,我們需要在類中重寫自定義的 encoding 和 decoding方法。這樣顯得十分痛苦而且很容易出錯。

在swift4.0 中,引入了新的Codable協議,可以讓你在不添加其他特殊代碼的情況下序列化和反序列化自定義的數據類型,從而不用擔心值類型的丟失。更漂亮的是,你可以選擇數據被序列化為什么樣的格式:plist(XML)或者JSON。

是的,Swift 4 可以讓你在不添加任何特殊代碼的情況下將自定義數據類型序列化為JSON。

以代碼為例:

首先,我們自定義一個數據類型:

struct Language:Codable {

var name: String

var version: Int

}

let swift = Language(name:"Swift",version:4)

let php = Language(name:"PHP",version:7)

let perl = Language(name:"Perl",version:6)

讓Language這個結構體遵從Codable協議,我們便可以將它轉化為json格式的數據展示:

let encoder = JSONEncoder()

let encoded = try? encoder.encode(swift){

//...

}

Swift將會自動編碼你的數據類型中的所有屬性。

我們可以使用encode和decode方法來編碼和解碼對象:

let encoder = JSONEncoder()

let encoded = try? encoder.encode(swift)

if encoded != nil {

if let json = String(data: encoded!,encoding:.utf8){

print(json)

}

}

let decoder = JSONDecoder()

if let decoded = try? decoder.decode(Language.self, from: encoded!)

{

print(decoded.name)

}

同樣可以有PropertyList的encode和decode:

//PropertyList

let propertyListEncoder = PropertyListEncoder()

let propertyListed = try? propertyListEncoder.encode(php)

let propertyDecoder = PropertyListDecoder()

if let value = try? propertyDecoder.decode(Language.self,from: propertyListed!)

{

print(value.name)

}

2.多行文字的字符串

之前我們可以通過使用"\n"來使字符串換行。比如:

語法說明:

1.以三個雙引號作為開始的標識。

2.以三個雙引號作為結束的標識。

3.不管開始標識還是結束標識,都必須單獨占據一行

4.你定義的字符串就是開始標識和結束標識中間的樣子

3.改進key-value coding的keypath

Swift中如何使用keypath呢?

首先,我們定義兩個結構體:

struct Crew {

var name: String

var rank:String

}

struct Starship {

var name: String

var maxWarp: Double

var captain: Crew

func goToMaximumWarp(){

print("\(name) is now travelling at warp \(maxWarp)")

}

}

let janeway = Crew(name:"Kathryn Janeway",rank:"Captain")

let voyager = Starship(name: "Voyager", maxWarp: 9.975, captain: janeway)

let enterWarp = voyager.goToMaximumWarp

enterWarp()

3.改進key-value coding的keypath

Swift中如何使用keypath呢?

首先,我們定義兩個結構體:

struct Crew {

var name: String

var rank:String

}

struct Starship {

var name: String

var maxWarp: Double

var captain: Crew

func goToMaximumWarp(){

print("\(name) is now travelling at warp \(maxWarp)")

}

}

let janeway = Crew(name:"Kathryn Janeway",rank:"Captain")

let voyager = Starship(name: "Voyager", maxWarp: 9.975, captain: janeway)

let enterWarp = voyager.goToMaximumWarp

enterWarp()

在Swift中,我們可以給函數添加一個引用。比如,我們可以給goToMaximumWarp()方法添加一個叫做enterWarp的引用,之后我們便可以使用enterWarp來調用它。然而,我們卻不能對屬性做同樣的操作。是的,我們不能給Starship的name屬性添加一個引用

這個問題,可以通過使用keypath來解決:正如enterWarp()一樣,它們是未被調用的屬性引用。 如果您現在調用引用,則得到當前值,但如果稍后調用引用,則獲得最新值。

keyPath的語法格式為反斜杠:

let nameKeyPath = \Starship.name

let maxWarpKeyPath = \Starship.maxWarp

let captainName = \Starship.captain.name

之后你便可以在Starship的實例中使用它了:

print(voyager[keyPath: nameKeyPath])? //Voyager

voyager[keyPath: nameKeyPath] = "456"

print(voyager.name)? //456

voyager.goToMaximumWarp()? //456 is now travelling at warp 9.975

enterWarp()? //Voyager is now travelling at warp 9.975

let starshipName = voyager[keyPath: nameKeyPath]

let starshipMaxWarp = voyager[keyPath: maxWarpKeyPath]

let starshipCaptain = voyager[keyPath: captainName]

之后你便可以在Starship的實例中使用它了:

print(voyager[keyPath: nameKeyPath])? //Voyager

voyager[keyPath: nameKeyPath] = "456"

print(voyager.name)? //456

voyager.goToMaximumWarp()? //456 is now travelling at warp 9.975

enterWarp()? //Voyager is now travelling at warp 9.975

let starshipName = voyager[keyPath: nameKeyPath]

let starshipMaxWarp = voyager[keyPath: maxWarpKeyPath]

let starshipCaptain = voyager[keyPath: captainName]

4.改進了字典功能:

Swift4.0 讓Dictionary的功能更強大。

在Swift3.0 中,Dictionary的filter函數會返回一個包含key/value元組的數組。

比如

let cities = ["Shanghai": 24_256_800, "Karachi": 23_500_000, "Beijing": 21_516_000, "Seoul": 9_995_000];

let massiveCities = cities.filter { $0.value > 10_000_000 }

在Swift3.0中,你不能通過massiveCities["Shanghai"]來獲取對應的值。因為massiveCities不是一個字典類型。只能通過massiveCities[0].value來獲取。

但在Swift4.0中,massiveCities是字典類型,使用massiveCities["Shanghai"]獲取值完全沒有問題。

print(massiveCities["Shanghai"] ?? "nil Value");

5.String 又變成了集合類型:

這意味著,你可以做字符串倒置,循環獲取每個字符,map(),flatMap()等操作。

let quote = "It is a truth universally acknowledged that new Swift versions bring new features."

let reversed = quote.reversed()

for letter in quote {

print(letter)

}

另外,Swift4.0 中,引入類似于python中字符串的一些操作。在省略起始位置或者結束位置的情況下,可以自動推斷集合的起始位置或者結束位置。

let characters = ["Dr Horrible", "Captain Hammer", "Penny", "Bad Horse", "Moist"]

let bigParts = characters[..<3]

let smallParts = characters[3...]

print(bigParts)? ? //["Dr Horrible", "Captain Hammer", "Penny"]

print(smallParts)? //["Bad Horse", "Moist"]

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,119評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,382評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,038評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,853評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,616評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,112評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,192評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,355評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,869評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,727評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,928評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,467評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,165評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,570評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,813評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,585評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,892評論 2 372

推薦閱讀更多精彩內容