日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Swift 范的 CGRect、CGSize 和 CGPoint

發布時間:2025/7/14 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Swift 范的 CGRect、CGSize 和 CGPoint 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

從我決定擁抱 Swift 到現在已經 8 個月了。這幾個月中,我一邊學習著如何避免寫出 Objective-C 風格的 Swift 代碼,一邊真正開始使用這門新語言。

不過最近我才發現,我的 CGGeometry 系列里結構體寫法還不是 Swift 風格。

CGRect, CGSize, CGPoint

C 語法 —— 披著羊皮的狼

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

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

好了,手放下吧。別擔心,這沒什么好害羞的。

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

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

Swift 在很多方面對初學者都很友好,無論你是剛接觸 Swift,還是剛接觸編程。如果讓初學者看上面的代碼,他可能完全不知道那些數字的含義。所以,讓我們來看看正確的 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)

每個參數前面都有了參數描述,這一點描述,就已經能讓我們在第一眼明白代碼含義了。除此之外,這種 CGGeometry 結構體構造器還有一個好處:傳入的參數不僅可以是 CGFloat 類型,也可以是 Int 和 Double。

Zero

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

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

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

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

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

取值

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

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

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

你的程序應該避免直接讀寫 CGRect 中的值,取而代之的是,采用對應的函數來處理相關參數。

— Apple, CGGeometry Reference Documentation

這可能就是你不直接訪問的原因吧,不過沒關系,Swift 提供了簡單的點語法訪問來取代之前不那么完美的 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 中列舉了很多相關細節,鏈接在文末。

可變

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

現在,你不僅可以直接修改 frame 中某一個變量的值,并且你也可以直接對 frame 包含的 origin 與 size 結構體重新賦值:

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

這特性就足以讓我們放棄使用 Objective-C 了。也終于不用為了修改 CGRect 的某一個值,而去創建一個全新的結構體了。作為 Objective-C 開發者,我不得不寫了快兩年這樣的代碼去修改 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;

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

別忘了

以上的這些寫法也同樣適用于 UIKit 的其他部分結構體:

UIEdgeInsets var edgeInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10) edgeInsets.top += 10UIOffsetvar offset = UIOffset(horizontal: 10, vertical: 10) offset.vertical += 10

文章代碼可在 GitHub 上找到。

本文由 SwiftGG 翻譯組翻譯,已經獲得作者翻譯授權,最新文章請訪問 http://swift.gg。

總結

以上是生活随笔為你收集整理的Swift 范的 CGRect、CGSize 和 CGPoint的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。