[iOS 10 day by day] Day 7:Measurement

在iPhone7發(fā)布之后,令人興奮的事情已經(jīng)塵埃落定,現(xiàn)在是時(shí)候繼續(xù)看看iOS10提供的新特性
這一周我們將要看看新的Measurement API:the Foundation framework的新部分街州。從表面上看得湘,它看起來并不是都那么興奮:它提供了一種在計(jì)量單位間轉(zhuǎn)化的方式就像公里和英里赦拘。

然而唯欣,當(dāng)你仔細(xì)思考它蝌诡,我們花費(fèi)了極多的時(shí)間去轉(zhuǎn)化值矗晃。這可能發(fā)生在由于你有角度,但是你所用來旋轉(zhuǎn)視圖所用的API要求用弧度畦浓。可選擇的检疫,可能因?yàn)槟愕膽?yīng)用用英里計(jì)算距離讶请,但是你需要為了那些更喜歡用公里單位的用戶去轉(zhuǎn)換成公里單位。
在iOS10之前,你可能有創(chuàng)造自己的函數(shù)去轉(zhuǎn)換值乘其它的單位或者用外部庫《嵋纾現(xiàn)在蘋果已經(jīng)為你提供了有很大操控提升的API论巍,所以讓我們看看它到底能做什么。

基礎(chǔ) The Basics
This post uses Swift 3 released as part of the Xcode 8 GM build.
我們用測量模型去創(chuàng)造我們的量度用特殊的維度风响。你可以把“dimension”當(dāng)作一個有關(guān)聯(lián)并且可以相互轉(zhuǎn)換的單位組嘉汰,比如克可以轉(zhuǎn)變成千克或者也能再次返回。每一個dimension有它自己的基礎(chǔ)單位状勤,而其它的單位就有了其相反的定義鞋怀。像容積的基本單位是公升,一毫升被定義為0.001公升持搜。

Creating Our Measurement
簡單的開始密似,假設(shè)我有一品脫的牛奶而且想知道它有多少毫升,像這樣:

let milk = Measurement(value: 1, unit: UnitVolume.imperialPints)
milk.converted(to: .liters)
// prints out 0.568261 L

這是很簡單的葫盼。一旦我們憑借單位dimension定義了我們的量度残腌,我們可以
合適的轉(zhuǎn)換成dimension的其它單位。我們自動檢查獲取milk變量的類型是Measurement<UnitVolume>贫导。它做了完美的表現(xiàn)抛猫,令我們可以合適的在這個組中轉(zhuǎn)換成其它的值。畢竟孩灯,我們?nèi)绾尾拍苻D(zhuǎn)換一公升的水成一公里闺金。

Operators
Measurement API 支持運(yùn)算符操作使用。
如果我們現(xiàn)在想要5品脫的牛奶钱反,我們可以這樣做

let fivePints = milk * 5

這個返回了新的量度掖看,因此我們可以依次轉(zhuǎn)換成其它的單位。

fivePints.converted(to: .cups)
// Prints 11.8387708333333 cup

你可以注意到當(dāng)我們在playground使用面哥,或者打印出Measurement哎壳,我們獲取了附加的單位符號。
當(dāng)然尚卫,乘法不是我們僅可用的操作符归榕。其它的,我們有相等:

let kms = Measurement(value: 5, unit: UnitLength.kilometers)
let meters = Measurement(value: 5000, unit: UnitLength.meters)
kms == meters // true

和加法:

kms + meters // 10000.0 m
Formatters

早先我提到的我們可能想去展現(xiàn)不同的單位在不同的地方吱涉。
伴隨著新的Measurement API刹泄,蘋果也提供了MeasurementFormatter,一個添加了個在轉(zhuǎn)化成字符串之前格式化量度的能力怎爵。

默認(rèn)的特石,the measurement formatter將會使用用戶當(dāng)前的區(qū)域。我們將會手動的改變?nèi)タ纯串?dāng)我們想去輸出在兩個城市間的距離時(shí)發(fā)生什么:

let newcastleToLondon = Measurement(value: 248, unit:     UnitLength.miles)

let formatter = MeasurementFormatter()
formatter.locale = Locale(identifier: "fr")
formatter.string(from: newcastleToLondon) // Prints 399,166 km

formatter.locale = Locale(identifier: "en_GB")
formatter.string(from: newcastleToLondon) // Prints 248 mi

好的鳖链!我們解決所有這些但是幾乎不需要我們自己做任何工作姆蘸。

Project
我們已經(jīng)快速看了這個API的基礎(chǔ)用法,因此讓我們對它做點(diǎn)有意思的事情。
我們將會創(chuàng)造一個風(fēng)力渦輪逞敷,伴隨著與能被滑塊所調(diào)校的風(fēng)速相比例旋轉(zhuǎn)的刀片狂秦。
這個渦輪相當(dāng)于一個uiview的子類。它被添加到UIViewControllerview上推捐,并伴隨著其它的基礎(chǔ)UI元素:這個滑塊調(diào)整風(fēng)速而且label將會用米每秒(m/s)和英里每小時(shí)(mph)來輸出風(fēng)速裂问。如果你想在playground中完整的查看,請到github上自由瀏覽牛柒。
我們將會集中在使用Measurement API的部分上:開始時(shí)堪簿,當(dāng)滑塊的值改變時(shí)展現(xiàn)風(fēng)速在label上:

 func handleWindSpeedChange(slider: UISlider) {
 let windSpeed = Measurement(value: Double(slider.value), unit: UnitSpeed.metersPerSecond)

 let milesPerHour = windSpeed.converted(to: .milesPerHour)

 windSpeedLabel.text = "Wind speed: \(windSpeed) (\(milesPerHour))"

}
我們的label就像下面這樣

未轉(zhuǎn)化的label.png

哇哦!我們不需要這么精確焰络,對于我們簡單的demo來說戴甩。有時(shí)我們展現(xiàn)了太多的小數(shù)以至于我們不能看見我們按照英里每小時(shí)的值。我們可以解決這個依靠我們先前簡要提到的MeasurementFormatter闪彼。

let windSpeed = Measurement(value: Double(slider.value), unit:   UnitSpeed.metersPerSecond)

let measurementFormatter: MeasurementFormatter = {
let formatter = MeasurementFormatter()
formatter.unitOptions = .providedUnit
let numberFormatter = NumberFormatter()
numberFormatter.minimumIntegerDigits = 1
numberFormatter.minimumFractionDigits = 1
numberFormatter.maximumFractionDigits = 1
formatter.numberFormatter = numberFormatter

return formatter
}()

let metersPerSecond = measurementFormatter.string(from: windSpeed)
let milesPerHour = measurementFormatter.string(from:        windSpeed.converted(to: .milesPerHour))

windSpeedLabel.text = "Wind speed: \(metersPerSecond) (\(milesPerHour))"

我們創(chuàng)建我們的formatter并且要求它使用特定的unitProvided甜孤。這個防止the formatter忽略我們所期望的單位并且輸出測試項(xiàng)目接受器tit (test item taker) 覺得最合適的值。對于我畏腕,若沒有設(shè)置這個值缴川,這個測試項(xiàng)目接受器tit (test item taker) 將會導(dǎo)致我們的量度都按照英里每小時(shí)輸出。
The measurement formatter它自己包含了其它能夠允許我們?nèi)ジ袷交瘮?shù)值部分的量度的formatter(feels a bit like formatter-ception!)描馅。我們要求這個數(shù)字僅展現(xiàn)一個小數(shù)把夸。
最后,我們需要去用formatter 去取出string構(gòu)成我們的m/s和英里每小時(shí)量度铭污。

轉(zhuǎn)化了的Labels.png

像一點(diǎn)可見的反饋恋日,我們想去增加渦輪旋轉(zhuǎn)的頻率當(dāng)風(fēng)速增加時(shí)(注意,這些值僅僅是為了教育的目的嘹狞,而且完全沒有從風(fēng)里獲取能量的物理學(xué)基礎(chǔ))岂膳。
這個TurbineView控制了動畫,但是我們需要去提供每秒刀片旋轉(zhuǎn)的角度磅网。你可能定義了一個在類里的屬性谈截,就像下面這樣:

 /// The angle the blades rotate per second, in radians.
 public var bladeRotationPerSecond: Double

這是OK的并且遵循了蘋果的API ,角度被弧度所提供涧偷。然而你怎么去阻止那些提供這些值時(shí)使用角度的用戶 簸喂。你可能會說:“那時(shí)應(yīng)該去讀說明文檔”。
這個參數(shù)可能有一些優(yōu)點(diǎn)燎潮,然而假使這個屬性沒有任何說明會怎樣喻鳄?它也會是一個相當(dāng)簡單的錯,對于大多數(shù)所習(xí)慣思考度數(shù)的角度的我們确封。
我們?nèi)绾问褂?code>Measurement除呵,限制僅僅接受有關(guān)角度的單位唉锌?這個
我們可以允許用戶提供任何他們覺得最舒服的角度并且在內(nèi)部轉(zhuǎn)化成任何我們需要的值。聽起來很棒竿奏,讓我們給出一段:

// TurbineView property
public var bladeRotationPerSecond: Measurement<UnitAngle> =    Measurement(value: 0, unit: UnitAngle.degrees) {
didSet {
  rotate()
}

}

在我們的視圖控制器我們可以決定每秒的循環(huán)用以下的代碼:

fun calculateTurbineRotation() {
// If we assume max value of slider = 1 rotation per second
let ratio = windSpeedSlider.value / windSpeedSlider.maximumValue

let fullRotation = Measurement(value: 360, unit: UnitAngle.degrees)

let rotationAnglePerSecond = fullRotation * Double(ratio)

turbine.bladeRotationPerSecond = rotationAnglePerSecond

}

我們可以用我們覺得最舒服的角度單位 --我選擇了角度。那之后我們使用基于當(dāng)前的風(fēng)速來容易的乘法操作去獲取旋轉(zhuǎn)的角度(如果滑塊值為0腥放,那速率將會是0/40=0泛啸,反之在數(shù)值范圍的最后如果滑塊的值為40那么速率將會是40/40=1)。
在這我們有了我們自己美麗的風(fēng)力渦輪秃症。

原文地址:[iOS 10 Day by Day :: Day 7 :: Measurement](https://www.shinobicontrols.com/blog/ios-10-day-by-day-day-7-measurement)
原作者:Sam Burnstone @sam_burnstone
ShinobiControls 官網(wǎng):ShinobiControls.com twitter : @shinobicontrols
譯者:simpleton king

看了戴倉薯的daybyday文章候址,突然就想自己也翻一篇,第一次翻譯文章种柑,如果有什么翻的不好的地方岗仑,敬請指正。之前的daybyday可以到戴倉薯的文集(http://www.reibang.com/notebooks/5278512/latest) 瀏覽聚请。
順便求個幫助荠雕,大家iOS10下面canlebypruduce的resumedata有出問題么 ?導(dǎo)致不能繼續(xù)重新下載驶赏。
查了下stackoverflow炸卑,有說是apple的bug。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末煤傍,一起剝皮案震驚了整個濱河市盖文,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蚯姆,老刑警劉巖五续,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異龄恋,居然都是意外死亡疙驾,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門篙挽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來荆萤,“玉大人,你說我怎么就攤上這事铣卡×淳拢” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵煮落,是天一觀的道長敞峭。 經(jīng)常有香客問我,道長蝉仇,這世上最難降的妖魔是什么旋讹? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任殖蚕,我火速辦了婚禮,結(jié)果婚禮上沉迹,老公的妹妹穿的比我還像新娘睦疫。我一直安慰自己,他們只是感情好鞭呕,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布蛤育。 她就那樣靜靜地躺著,像睡著了一般葫松。 火紅的嫁衣襯著肌膚如雪瓦糕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天腋么,我揣著相機(jī)與錄音咕娄,去河邊找鬼。 笑死珊擂,一個胖子當(dāng)著我的面吹牛圣勒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播未玻,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼灾而,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了扳剿?” 一聲冷哼從身側(cè)響起旁趟,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎庇绽,沒想到半個月后锡搜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瞧掺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年耕餐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辟狈。...
    茶點(diǎn)故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡肠缔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出哼转,到底是詐尸還是另有隱情明未,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布壹蔓,位于F島的核電站趟妥,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏佣蓉。R本人自食惡果不足惜披摄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一亲雪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧疚膊,春花似錦义辕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至贞让,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間柳譬,已是汗流浹背喳张。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留美澳,地道東北人销部。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像制跟,于是被迫代替她去往敵國和親舅桩。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評論 2 355

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

  • 《iOS 10 day by day》是 shinobicontrols 公司編寫的系列博客雨膨,介紹開發(fā)者需要了解的...
    戴倉薯閱讀 1,332評論 0 5
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理擂涛,服務(wù)發(fā)現(xiàn),斷路器聊记,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,140評論 30 470
  • 天一丹走在又冷又黑的小巷撒妈,風(fēng)衣在黑夜中嗦嗦作響,黃昏在世界的另一邊排监,韓胡曉甩著雙手狰右,慢悠悠的走在在三三兩兩有情人...
    墨跡哼出閱讀 184評論 0 1
  • 今年的夏天棋蚌,好像比往年來的更早一些。 他穿著件白色T恤挨队,黑色阿迪短褲谷暮,白色鞋幫已經(jīng)有些泛黃的匡威布鞋。 為了躲避中...
    用屁股思考2017閱讀 324評論 0 0