Swift Language Guide顯示像下面這樣的運算子方法必須寫成static:
struct Vector2D {
var x = 0.0, y = 0.0
}
extension Vector2D {
static func (left: Vector2D, right: Vector2D) -> Vector2D {
return Vector2D(x: left.x right.x, y: left.y right.y)
}
}
let vector = Vector2D(x: 3.0, y: 1.0)
let anotherVector = Vector2D(x: 2.0, y: 4.0)
let combinedVector = vector anotherVector
如果去掉static關鍵字,會導致編譯錯誤:
在“Vector2D”的擴展中宣告的運算子“ ”必須為“靜態”
這個要求的原因是什么?為什么我們不能把它寫成非靜態方法?
我可以盲目地接受“這就是它的完成方式”。但我想了解為什么這是必要的,以便我可以更好地理解 Swift 語言。我一直無法找到此要求的具體原因。
如果非要我猜的話,我猜 Swift 中的默認運算子是作為型別方法實作的,因此我們的自定義運算子也必須是靜態的。但這純粹是猜測。
uj5u.com熱心網友回復:
這是一種語言設計選擇,不同的語言決定了對立面:C 不允許靜態運算子,而 C# 要求它們是靜態的,就像 Swift 一樣。
對我來說,讓運算子保持靜態的最令人信服的理由是對稱性。
讓我們暫時替換 為名為 的函式plus。如果plus是靜態的,則將其稱為Vector2D.plus(vector, anotherVector),這與呼叫Vector2D.plus(anotherVector, vector).
如果它是一個實體成員,您可以將其稱為vector.plus(anotherVector),這可能與anotherVector.plus(vector). 即如果vector是nil,vector.plus(anotherVector)則肯定是nil,而anotherVector.plus(vector)將等于anotherVector。
同樣,無論兩個向量的狀態如何, 靜態運算子都允許。vector anotherVector == anotherVector vectornil
uj5u.com熱心網友回復:
運算子不必是靜態的。它們也可以是全域函式。
struct Vector2D {
var x = 0.0, y = 0.0
}
func (left: Vector2D, right: Vector2D) -> Vector2D {
return Vector2D(x: left.x right.x, y: left.y right.y)
}
let vector = Vector2D(x: 3.0, y: 1.0)
let anotherVector = Vector2D(x: 2.0, y: 4.0)
let combinedVector = vector anotherVector
如果你問為什么它們不能是實體方法,那么,因為實體方法需要一個額外的實體Vector2D來呼叫。那個實體,加上 需要的兩個引數,意味著你需要 3Vector2D秒來呼叫 ,這沒有多大意義......
另一方面,運算子可以這樣設計:
extension Vector2D {
func (right: Vector2D) -> Vector2D { ... }
}
其中,二元運算子不是對兩個引數進行操作,而是對self單個引數進行操作。這類似于 Kotlin 的運算子多載的設計方式。
據我所知,Swift 中沒有任何東西可以阻止 Swift 被設計成這樣。這樣做的原因很可能是美學,例如“有 2 個引數更有意義”,正如 Duncan C 所建議的那樣,并且有 2 個引數也更清楚哪個是左運算元,哪個是右運算元。
uj5u.com熱心網友回復:
這對我來說很有意義。二元運算子將 2 個物件作為引數,并回傳結果。
這樣的運算子不屬于任何物件的實體。它是類上的靜態方法。對于您 的Vector2D型別方法示例,它是一種知道如何將 2 個Vector2D物件相加的方法。
您不會 在 的實體上呼叫該方法Vector2D。你說“嘿,Vector2D型別,我如何將你的型別的兩個實體加在一起?。
您正在“與”班級“交談”,而不是該班級的實體。
編輯:
如果它是一個實體方法,則必須將 add 運算子表示為對其中一個運算元的訊息:
extension Vector2D {
func addVector(_: Vector2D) -> Vector2D {
// Code to sum two vectors
}
}
你會稱它為
sum = aVector.addVector(anotherVector)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/314774.html
上一篇:未呼叫viewDidLoad()
