所以我們都知道,在 Swift 中宣告一個類,
let variable = ClassName(parameters)
但是你說,要宣告陣列和整數之類的東西,你可以說
let variable = 32(而不是Int(32))
let variable = [3,2,4](而不是let variable = Array<Int>(3,2,4)
假設我想為復數(虛數)創建一個類,可以這樣宣告:
let complexNumber = 5i
或者
let complexNumber = 3i
請注意,復數不一定是問題的重點,并且使您自己的不可裝箱是
uj5u.com熱心網友回復:
Swift 字面量
在 Swift 中,您描述的這些語法稱為“文字”,這是一種用于初始化符合特定協議集的型別值的便捷方法。文字的語法不是用戶可擴展的,因為它依賴于 Swift 決議器來理解如何決議它們。支持的有:
| 文字 | 協議 |
|---|---|
| 整數 | ExpressibleByIntegerLiteral |
| 浮點 | ExpressibleByFloatLiteral |
| 細繩 | ExpressibleByStringLiteral |
| 擴展字素簇 | ExpressibleByExtendedGraphemeClusterLiteral |
| Unicode 標量 | ExpressibleByUnicodeScalarLiteral |
| 布林值 | ExpressibleByBooleanLiteral |
| 零 | ExpressibleByNilLiteral |
| 大批 | ExpressibleByArrayLiteral |
| 字典 | ExpressibleByDictionaryLiteral |
(有關詳細資訊,請參閱 NSHipster 關于文字的文章)。
但我更廣泛地理解您的觀點:您想在 Swift 代碼中以類似的方式表達來自另一個領域(例如數學)的語法,因此該領域的主題專家很熟悉。
有很多解決方法,具體取決于特定問題。
對于您的復數示例,可以做的是定義一個Complex帶有*運算子和i值的新型別,它可以讓您撰寫:
let complexNumber = 5 * i
有很多數字編程庫(尤其是第一方swift-numerics,它們定義了這種型別(盡管不一定是相同的語法)。
您還可以看到 Apple 對 SwiftUI 所做的事情,使用結果構建器構建 Swift DSL 以雄辯地描述視圖層次結構。
獎勵:這不是“拳擊”
這里沒有拳擊比賽。我懷疑您來自 Java 背景,其中裝箱是分配物件以存盤原始型別的程序,因為只有這樣才能將它們傳遞到物件中(例如存盤到容器中ArrayList)。
在 Swift 中情況并非如此。沒有“原始”型別。有參考型別(類的實體和類系結協議存在)和值型別(結構、列舉和協議存在)。Swift 的具體化泛型可以處理值和參考物件,例如Int可以直接進入Array<Int>. 所以大多數時候,沒有拳擊要做。
有些地方 Swift 遇到了同樣的問題,這使得 Java 需要對值進行裝箱:像陣列這樣的連續存盤無法處理不同大小的元素,所以這樣的代碼成為一個挑戰:
let x: Array<Any> = [true, "abc", 123, someObject]
此外,需要某種方式來表達如何處理不同型別的值(保留、釋放、復制等)。
為了解決這些問題,編譯器將自動生成代碼,將這些值裝箱到稱為“存在容器”的盒子中,這些盒子存盤值,以及描述可以對該值執行的操作的函式指標表。雖然值的大小不同,但所有存在容器都具有相同的大小,因此您可以使用它們創建一個陣列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/483975.html
標籤:迅速
下一篇:如何將資料傳遞給最終視圖控制器
