swift4.0 新特性

#1.添加Codable協(xié)議彪标,方便自定義數(shù)據(jù)類型序列化
#2.添加定義多行字符串語法
#3.改進(jìn)key-value coding的keypath
#4.修改并強(qiáng)化字典功能
#5.字符串變?yōu)榧项愋?/p>

1.Swifty encoding and decoding:

在Objective-C中值類型的相互影響是十分糟糕的。比如NSCoding協(xié)議野来,類繼承它之后,我們需要在類中重寫自定義的 encoding 和 decoding方法。這樣顯得十分痛苦而且很容易出錯(cuò)。
在swift4.0 中蹬癌,引入了新的Codable協(xié)議,可以讓你在不添加其他特殊代碼的情況下序列化和反序列化自定義的數(shù)據(jù)類型虹茶,從而不用擔(dān)心值類型的丟失逝薪。更漂亮的是,你可以選擇數(shù)據(jù)被序列化為什么樣的格式:plist(XML)或者JSON蝴罪。
是的董济,Swift 4 可以讓你在不添加任何特殊代碼的情況下將自定義數(shù)據(jù)類型序列化為JSON。
以代碼為例:
首先要门,我們自定義一個(gè)數(shù)據(jù)類型:

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這個(gè)結(jié)構(gòu)體遵從Codable協(xié)議虏肾,我們便可以將它轉(zhuǎn)化為json格式的數(shù)據(jù)展示:

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

Swift將會(huì)自動(dòng)編碼你的數(shù)據(jù)類型中的所有屬性。
我們可以使用encode和decode方法來編碼和解碼對(duì)象:

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

了解更多關(guān)于swift4.0 encode和decode的內(nèi)容欢搜,可以參考鏈接:the Swift Evolution proposal for this new feature

2.多行文字的字符串:

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

let beforeString = "When you write a string that spans multiple \nlines make sure you start its content on a  \nline all of its own, and end it with three \nquotes also on a line of their own. Multi-line strings also let you write \"quote marks\" \nfreely inside your strings, which is great!"
//print(beforeString)

這種方式閱讀起來很不方便,看起來很不美觀炒瘟,不能直觀的顯示它所要呈現(xiàn)給用戶展示的樣子吹埠。
在swift4.0中,提供了專門的語法來顯示多行字符串疮装,從而告別轉(zhuǎn)義缘琅。

let longString = """
When you write a string that spans multiple
lines make sure you start its content on a
line all of its own, and end it with three
quotes also on a line of their own.
Multi-line strings also let you write "quote marks"
freely inside your strings, which is great!
"""
print(longString)

語法說明:
1.以三個(gè)雙引號(hào)作為開始的標(biāo)識(shí)。
2.以三個(gè)雙引號(hào)作為結(jié)束的標(biāo)識(shí)廓推。
3.不管開始標(biāo)識(shí)還是結(jié)束標(biāo)識(shí)刷袍,都必須單獨(dú)占據(jù)一行
4.你定義的字符串就是開始標(biāo)識(shí)和結(jié)束標(biāo)識(shí)中間的樣子

了解更多可以參考鏈接:the Swift Evolution proposal for this new feature.

3.改進(jìn)key-value coding的keypath

Swift中如何使用keypath呢?
首先樊展,我們定義兩個(gè)結(jié)構(gòu)體:

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")
var voyager = Starship(name: "Voyager", maxWarp: 9.975, captain: janeway)
let enterWarp = voyager.goToMaximumWarp
enterWarp()

在Swift中呻纹,我們可以給函數(shù)添加一個(gè)引用。比如专缠,我們可以給goToMaximumWarp()方法添加一個(gè)叫做enterWarp的引用雷酪,之后我們便可以使用enterWarp來調(diào)用它。然而藤肢,我們卻不能對(duì)屬性做同樣的操作太闺。是的糯景,我們不能給Starship的name屬性添加一個(gè)引用嘁圈。
這個(gè)問題省骂,可以通過使用keypath來解決:正如enterWarp()一樣,它們是未被調(diào)用的屬性引用最住。 如果您現(xiàn)在調(diào)用引用钞澳,則得到當(dāng)前值,但如果稍后調(diào)用引用涨缚,則獲得最新值轧粟。
keyPath的語法格式為反斜杠:

let nameKeyPath = \Starship.name
let maxWarpKeyPath = \Starship.maxWarp
let captainName = \Starship.captain.name

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

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]

想要了解更多,可以參考鏈接:the Swift Evolution proposal for this new feature

4.改進(jìn)了字典功能:

Swift4.0 讓Dictionary的功能更強(qiáng)大脓魏。
在Swift3.0 中兰吟,Dictionary的filter函數(shù)會(huì)返回一個(gè)包含key/value元組的數(shù)組。
比如:

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"]來獲取對(duì)應(yīng)的值混蔼。因?yàn)閙assiveCities不是一個(gè)字典類型。只能通過massiveCities[0].value來獲取珊燎。
但在Swift4.0中惭嚣,massiveCities是字典類型,使用massiveCities["Shanghai"]獲取值完全沒有問題悔政。

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

想要了解更多晚吞,可以參考鏈接:the Swift Evolution proposal for these new features.

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

這意味著,你可以做字符串倒置谋国,循環(huán)獲取每個(gè)字符槽地,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中字符串的一些操作旅急。在省略起始位置或者結(jié)束位置的情況下逢勾,可以自動(dòng)推斷集合的起始位置或者結(jié)束位置。

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"]

想要了解更多藐吮,可以參考鏈接:the Swift Evolution proposal for this new feature.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末溺拱,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子谣辞,更是在濱河造成了極大的恐慌迫摔,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件泥从,死亡現(xiàn)場(chǎng)離奇詭異句占,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)躯嫉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門纱烘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來杨拐,“玉大人,你說我怎么就攤上這事擂啥『逄眨” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵哺壶,是天一觀的道長屋吨。 經(jīng)常有香客問我,道長山宾,這世上最難降的妖魔是什么至扰? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮资锰,結(jié)果婚禮上渊胸,老公的妹妹穿的比我還像新娘。我一直安慰自己台妆,他們只是感情好翎猛,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著接剩,像睡著了一般切厘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上懊缺,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天疫稿,我揣著相機(jī)與錄音,去河邊找鬼鹃两。 笑死遗座,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的俊扳。 我是一名探鬼主播途蒋,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼馋记!你這毒婦竟也來了号坡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤梯醒,失蹤者是張志新(化名)和其女友劉穎宽堆,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體茸习,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡畜隶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片籽慢。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡浸遗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出嗡综,到底是詐尸還是另有隱情,我是刑警寧澤杜漠,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布极景,位于F島的核電站,受9級(jí)特大地震影響驾茴,放射性物質(zhì)發(fā)生泄漏盼樟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一锈至、第九天 我趴在偏房一處隱蔽的房頂上張望晨缴。 院中可真熱鬧,春花似錦峡捡、人聲如沸击碗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽稍途。三九已至,卻和暖如春砚婆,著一層夾襖步出監(jiān)牢的瞬間械拍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來泰國打工装盯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留坷虑,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓埂奈,卻偏偏與公主長得像迄损,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子账磺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

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