簡體   English   中英

Swift將數組作為參數錯誤傳遞

[英]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分配值。

UIRectCornerOptionSet ,因此當您在函數調用中編寫[.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM