当字典键上的Swift“if let ...”失败时会发生什么?

时间:2016-12-12 12:08:44

标签: swift dictionary optional forced-unwrapping

我有一本字典,当它没有预先存在的值符合某个标准时,故意设置为失败。

所有其他时间,此命令将起作用,但一次。我希望我做对了......失败意味着没有任何反应。我不需要 Dim fmt As StringFormat = New StringFormat(StringFormatFlags.LineLimit) fmt.LineAlignment = StringAlignment.Center fmt.Trimming = StringTrimming.EllipsisCharacter Dim y As Single = e.MarginBounds.Top Dim rc As Rectangle Dim x As Int32 Dim h As Int32 = 0 Do While mRow < dgvChemical.RowCount Dim row As DataGridViewRow = dgvChemical.Rows(mRow) x = e.MarginBounds.Left h = 0 If newPage Then For Each cell As DataGridViewCell In row.Cells rc = New Rectangle(x, y, cell.Size.Width, cell.Size.Height) e.Graphics.FillRectangle(Brushes.LightGray, rc) e.Graphics.DrawRectangle(Pens.Black, rc) e.Graphics.DrawString(dgvChemical.Columns(cell.ColumnIndex).HeaderText, dgvChemical.Font, Brushes.Black, rc, fmt) x += rc.Width h = Math.Max(h, rc.Height) Next y += h mRow += 0 End If newPage = False x = e.MarginBounds.Left For Each cell As DataGridViewCell In row.Cells rc = New Rectangle(x, y, cell.Size.Width, cell.Size.Height) e.Graphics.DrawRectangle(Pens.Black, rc) e.Graphics.DrawString(cell.FormattedValue.ToString(), dgvChemical.Font, Brushes.Black, rc, fmt) x += rc.Width h = Math.Max(h, rc.Height) Next y += h mRow += 1 If y + h > e.MarginBounds.Bottom Then e.HasMorePages = True newPage = True Return End If Loop mRow = 0 Dim ps As PaperSize For ix As Integer = 0 To PrintDocument1.PrinterSettings.PaperSizes.Count - 1 If PrintDocument1.PrinterSettings.PaperSizes(ix).Kind = PaperKind.A3 Then ps = PrintDocument1.PrinterSettings.PaperSizes(ix) PrintDocument1.DefaultPageSettings.PaperSize = ps PageSetupDialog1.PageSettings.PaperSize = ps End If Next` 或任何其他应急代码。

但是这样吗?

else

2 个答案:

答案 0 :(得分:1)

当您隐式解包可选项时,可以在单个语句中检查和解包其值。所以你不需要任何错误处理代码

这样做

if let definiteString = assumedString {
   print(definiteString)
}

相当于

if assumedString != nil {
   print(assumedString)
}

您可以阅读有关隐式展开的可选here

的更多信息

答案 1 :(得分:1)

这不完全正确,问题是转换为int也是可选的。例如,这会崩溃(或者更确切地说,你会得到一个编译错误):

let myDictionary = [3: "3"]
let itemID = "b"
if let myTestKonstant = myDictionary[Int(itemID)] {
    print(myTestKonstant)
}  

这将是保存方式:

if let itemKey = Int(itemID), let myTestKonstant = myDictionary[itemKey] {
    print(myTestKonstant)
}

<强>更新

所以更清楚,我将解释在不同情况下会发生什么:

  1. itemID无法转换为Int:这意味着itemKey将为nil,因此,第二部分甚至不会进行测试,if的内容不会被执行。

  2. itemID可以转换为Int,但它不是现有密钥:在这种情况下,itemKey将设置为Int {{ 1}}被转换为。然后,将测试第二个语句,但由于itemID不会被发现为现有键,itemKey将返回myDictionary[itemKey],并且再次,if的内容将不会被执行。

  3. nil可以转换为作为字典键的itemID。与前一种情况一样,Int将被设置,并且由于找到了密钥,itemKey将被填充并且if的内容将被执行,除非密钥的对应值是{{ 1}}(如myTestKonstant)。