iOS Swift No 23 不透明型別2

2021-10-08 05:30:00 字數 2686 閱讀 7533

返回乙個不透明型別看起來和使用協議型別作為函式的返回型別是比較相似的。 但是兩個種類的返回型別不的地方在於它們各自保留的返回型別標識。乙個不透明型別引用的是乙個特殊的型別,即便是函式的呼叫者也不能看到是哪乙個型別,乙個協議型別可以引用任何乙個遵循協議的型別。簡單來講,協議型別給我們更多關於它儲存值的潛在型別的靈活性。而不透明型別可以是我們更加確定潛在型別的型別。

下面是乙個返回協議型別的flip(_:)版本,其替代了使用不透明型別作為返回型別

func protoflipshape

>

(_ shape: t)

->

shape

func protoflipshape

>

(_ shape: t)

->

shape

return

flippedshape

(shape: shape)

}

修正過後的這個**版本,它會基於傳入的圖形形狀返回乙個square的例項或flippedshape的例項。函式返回這兩個翻轉的圖形形狀可能是完全不同的型別。 函式的其他有效版本可能返回的是不同型別的值,當我們飯莊相同圖案形狀的多個例項的時候。protoflip(_:)上的較少的返回型別資訊意味著很多個操作基於在無效的返回值上,舉個例子,不可以使用==操作符來對比函式返回值的結果。

let protoflipped******** =

protoflip

(small********)

let samething =

protoflip

(small********)

protoflipped******** == samething // error

函式將協議型別當作返回型別使用會給我們採用該協議而返回的任何型別很多靈活性。然而,換取靈活性的代價就是有些操作在返回值上面是無法執行的。 這個例子就給我們說明了==操作符是無效的。 無效的原因就是它取決於不使用協議型別不保留的特定型別資訊。

使用該方法的另乙個問題就是這個圖形轉化並不會巢狀,翻轉長方形的結構其實是乙個shape型別的值。函式protoflip(_:)採用的是遵循shape協議型別的乙個引數,協議型別的值並不遵循協議。函式的返回值並不遵循shape協議,這就意味著像protoflip(protoflip(smalltriange))這樣的**應用了很多個轉換是無效的,是因為翻轉形狀對函式protoflip(_:)來說是無效的引數。

比較起來,不透明型別保留了基礎型別的標識,所以swift可以推斷關聯型別,這就會使我們可以在協議型別不能用作返回值的地方使用不透明返回值。舉個例子下面的這個就是來自泛型中的container協議的乙個版本

protocol

container

subscript

(i:int)-

>

item

}extension

array

:container

之所以不能把container當作函式的返回值來使用,是因為該協議有乙個關聯型別。同樣的我們也不可以在泛型返回型別裡把它(container協議)當作乙個約束來使用。因為在函式體的外面沒有跟多資訊來讓swift推斷出該泛型型別的種類。

// error: protocol with associated types can't be used as a return type.

func makeprotocolcontainer

(item: t)

->

container

// error: not enough information to infer c.

func makeprotocolcontainercontainer

>

(item: t)

-> c

使用不透明型別some container來作為返回型別表達了api所需的協定。 - 函式返回容器 但是拒絕指明容器的型別。

func makeopaquecontainer

(item: t)

-> some container

let opaquecontainer =

makeopaquecontainer

(item:12)

let twelve = opaquecontainer[0]

print

(type

(of: twelve)

)// prints "int

型別twelve可以被推斷為int,這恰恰恰說明了型別推斷適用於不透明型別。在makeopaquecontainer(item:)的實現中泛型容器的潛在型別是[t], t 是int所以返回值是乙個整數的陣列,並且item的關聯型別可以被推斷為int。container的下標返回的是item,這就意味著twelve型別同樣可以被推斷為int

opacity 不透明度

opacity 不透明度 初始值 1 不透明 繼承性 是 css3提出opacity屬性 div目前較老的firefox版本,我們需要使用 moz 字首,而對於舊的safari chrome版本,我們需要使用 webkit 字首。而對於更老的還在使用khtml核心而不是webkit核心的safari...

如何實現容器透明,內容不透明?

3.透明度問題 opacity 在ie中透明度不顯示,當我們向父元素中新增子元素的時候,就會發現子元素繼承了父元素的透明度。而在某些情況下這是我們不希望發生的。即使你重新設定子元素的透明度為不透明,它仍然會繼承父元素的透明度。要怎樣解決這個問題呢?我們可以使用絕對定位來使這些元素看起來像父子關係。你...

不透明度和DHTML

理查德 拉特 richard rutter 的 不帶flash漸隱 的onload影象漸隱演示了一種使用css不透明度屬性的動態更改為 建立 淡入 效果的方法。不透明度不是css 2.1規範的一部分 儘管css 3涵蓋了它 因此不同的瀏覽器具有不同的控制方式。richard的setopacity 函...