[英]Swift pass an array as argument error
我剛開始使用Swift。 有人可以向我解釋為什么我可以將數組作為參數傳遞(byRoundingCorners :)
UIBezierPath(
roundedRect: self.bounds,
byRoundingCorners: [.topLeft, .bottomLeft],
cornerRadii: CGSize(width: radius, height: radius))
但是將其傳遞給變量會產生錯誤
var corners = [UIRectCorner.topLeft, UIRectCorner.bottomLeft]
let path = UIBezierPath(
roundedRect: self.bounds,
byRoundingCorners: corners,
cornerRadii: CGSize(width: radius, height: radius))
“無法將類型'[UIRectCorner]'的值轉換為預期的參數類型'UIRectCorner'”
它不是數組。 這是一個OptionSet
。 所述byRoundingCorners
參數期望的類型的UIRectCorner
延伸OptionSet
。
如果您將corners
聲明更新為:
var corners: UIRectCorner = [.topLeft, .bottomLeft]
那么您的代碼將按預期工作。
[ ]
語法在這里實際上不是數組,它是集合的選項列表。
首次嘗試有效,因為編譯器可以從參數推斷數據類型( UIRectCorner
)。
但是當您這樣做時:
var corners = [UIRectCorner.topLeft, UIRectCorner.bottomLeft]
推斷的類型是UIRectCorner
的數組,而不是UIRectCorner
。 通過: UIRectCorner
添加: UIRectCorner
,您可以清楚地知道類型是什么,並且將使用[ ]
的語法正確地解釋為選項列表而不是數組。
正如Martin R提到的(感謝), OptionSet
擴展了ExpressibleByArrayLiteral
,它允許使用類似於數組的文字語法為UIRectCorner
分配值。
UIRectCorner
在OptionSet
,因此當您在函數調用中編寫[.topLeft, .bottomLeft]
時,Swift會根據該數組文字自動創建UIRectCorner
的實例。
但是,當你寫
var corners = [UIRectCorner.topLeft, UIRectCorner.bottomLeft]
您將創建一個UIRectCorner
選項集數組,而不是包含所有不同情況的單個選項集。
您可以通過將corners
的類型指定為UIRectCorner
來解決此UIRectCorner
。 這也將允許您推斷數組文字中的類型:
var corners: UIRectCorner = [.topLeft, .topRight]
遇到問題的Swift 5示例嘗試追加並最終發現插入是解決可變情況的方法。
var cornersToRound: UIRectCorner = []
if topLeftRounded { cornersToRound.insert(.topLeft) }
if topRightRounded { cornersToRound.insert(.topRight) }
if bottomRightRounded { cornersToRound.insert(.bottomRight) }
if bottomLeftRounded { cornersToRound.insert(.bottomLeft) }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.