Swift 范的 CGRect、CGSize 和 CGPoint(轉(zhuǎn))

非原創(chuàng)文章,轉(zhuǎn)載自: https://segmentfault.com/a/1190000005737999

作者:Andyy Hope,原文鏈接,原文日期:2016/02/03譯者:saitjr;校對:Channe;定稿:aaaron7

從我決定擁抱 Swift 到現(xiàn)在已經(jīng) 8 個(gè)月了。這幾個(gè)月中,我一邊學(xué)習(xí)著如何避免寫出 Objective-C 風(fēng)格的 Swift 代碼,一邊真正開始使用這門新語言。

不過最近我才發(fā)現(xiàn),我的 CGGeometry 系列里結(jié)構(gòu)體寫法還不是 Swift 風(fēng)格。

CGRect, CGSize, CGPoint

C 語法 —— 披著羊皮的狼

我相信下面這種寫法,很多 Swift 開發(fā)者都會中槍,讓我看見你們的雙手!

let rect = CGRectMake(0, 0, 100, 100)
let point = CGPointMake(0, 0)
let size = CGSizeMake(100, 100)

好了,手放下吧。別擔(dān)心,這沒什么好害羞的。

這樣寫是不對的,它很不 Swift 范。雖然它并不影響程序本身,但是它看起來更有點(diǎn) Objective-C 范,或者... Java 范。

iOS 或 OS X 開發(fā)者能輕易說出這段代碼的含義。這些語句早已爛熟于心,他們根本不會去糾結(jié) CGGeometry 結(jié)構(gòu)體的這些參數(shù)代表什么。

Swift 在很多方面對初學(xué)者都很友好,無論你是剛接觸 Swift,還是剛接觸編程。如果讓初學(xué)者看上面的代碼,他可能完全不知道那些數(shù)字的含義。所以,讓我們來看看正確的 Swift 姿勢吧:

let rect = CGRect(x: 0, y: 0, width: 100, height: 100)
let size = CGSize(width: 100, height: 100)
let point = CGPoint(x: 0, y: 0)

每個(gè)參數(shù)前面都有了參數(shù)描述,這一點(diǎn)描述,就已經(jīng)能讓我們在第一眼明白代碼含義了。除此之外,這種 CGGeometry 結(jié)構(gòu)體構(gòu)造器還有一個(gè)好處:傳入的參數(shù)不僅可以是 CGFloat 類型,也可以是 Int 和 Double。

Zero

let rect = CGRectZero
let size = CGSizeZero
let point = CGPointZero

看上面這段代碼,你很有可能還在這樣寫,對吧?

我們也應(yīng)該將這種寫法替換成 Swift 風(fēng)格。別怕,只是多了一個(gè)字符而已。你能猜到怎么寫嗎?

let rect = CGRect.zero
let size = CGSize.zero
let point = CGPoint.zero

這樣寫代碼也更為清晰,Xcode 會將 . 前后部分分開高亮,.zero 會更亮一點(diǎn)(當(dāng)然這取決于你的 Xcode 主題)。

取值

CGRect frame = CGRectMake(0, 0, 100, 100)
CGFloat width = CGRectGetWidth(frame)
CGFloat height = CGRectGetHeight(frame)
CGFloat maxX = CGRectGetMaxX(frame)
CGFloat maxY = CGRectGetMaxY(frame)

如果你依然是個(gè)合格的 Objective-C 公民,那么你會采用以上方式去取 rect 中特定的值。但是...為什么我們不直接去訪問這個(gè)變量呢?

CGFloat width = frame.size.width
CGFloat height = frame.size.height

你的程序應(yīng)該避免直接讀寫 CGRect 中的值,取而代之的是,采用對應(yīng)的函數(shù)來處理相關(guān)參數(shù)。
— Apple, CGGeometry Reference Documentation

這可能就是你不直接訪問的原因吧,不過沒關(guān)系,Swift 提供了簡單的點(diǎn)語法訪問來取代之前不那么完美的 API。

let frame = CGRect(x: 0, y: 0, width: 100, height: 100)
let width = frame.width
let height = frame.height
let maxX = frame.maxX
let maxY = frame.maxY

我還在 Swift playground 中列舉了很多相關(guān)細(xì)節(jié),鏈接在文末。

可變

let frame = CGRect(x: 0, y: 0, width: 100, height: 100)
let view  = UIView(frame: frame)
view.frame.origin.x += 10

現(xiàn)在,你不僅可以直接修改 frame 中某一個(gè)變量的值,并且你也可以直接對 frame 包含的 originsize 結(jié)構(gòu)體重新賦值:

let view = UIView(frame: .zero)
view.frame.size   = CGSize(width: 10, height: 10)
view.frame.origin = CGPoint(x: 10, y: 10)

這特性就足以讓我們放棄使用 Objective-C 了。也終于不用為了修改 CGRect 的某一個(gè)值,而去創(chuàng)建一個(gè)全新的結(jié)構(gòu)體了。作為 Objective-C 開發(fā)者,我不得不寫了快兩年這樣的代碼去修改 frame

objective-c
CGRect frame = CGRectMake(0, 0, 100, 100);
UIView *view = [[UIView alloc] initWithFrame: frame];
CGRect newFrame = view.frame;
newFrame.size.width = view.frame.origin.x + 10;
view.frame = newFrame;

不知道你怎樣想,反正這樣的代碼真的令我抓狂。先將 viewframe 賦值給 newFrame,然后再修改 newFrame,最后重新賦給 view.frame。夠了,謝謝你全家,我再也不想這樣寫了。

別忘了

以上的這些寫法也同樣適用于 UIKit 的其他部分結(jié)構(gòu)體:


UIEdgeInsets 

var edgeInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
edgeInsets.top += 10

UIOffset

var offset = UIOffset(horizontal: 10, vertical: 10)
offset.vertical += 10

點(diǎn)擊獲取代碼 可在 GitHub 上找到。
本文由 SwiftGG 翻譯組翻譯,已經(jīng)獲得作者翻譯授權(quán),最新文章請?jiān)L問 http://swift.gg。

文/VV木公子(簡書作者)
PS:如非特別說明,所有文章均為原創(chuàng)作品,著作權(quán)歸作者所有,轉(zhuǎn)載轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),并注明出處,所有打賞均歸本人所有!如果您是iOS開發(fā)者,或者對本篇文章感興趣,請關(guān)注本人,后續(xù)會更新更多相關(guān)文章!敬請期待!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • -1- 愛情的路上兜兜轉(zhuǎn)轉(zhuǎn)這么多年,幸好還沒有錯過愛我的你。 《剩者為王》里舒淇飾演的盛如曦說:我這個(gè)人啊,折騰了...
    左郁閱讀 562評論 0 4
  • 發(fā)呆了許久 頭腦還是一片空白 沒有直覺,沒有心情,沒有期待,沒有希望,沒有…… 終于一天如一天的狀態(tài)如此糟糕 雖然...
    緩緩歸矣y閱讀 241評論 2 2

友情鏈接更多精彩內(nèi)容