1

多くの言語とは異なり、Swiftswitchは網羅的でなければなりません。

enum Enumeration
{
    case A
    case B
}

次に、このコードは無効です。

switch enumeration
{
case .A:
    break
}

ただし、これらは有効です。

switch enumeration
{
case .A:
    break
case .B:
    break
}

switch enumeration
{
case .A:
    break
default:
    break
}

後で に追加case CするEnumerationと、最初の有効なコードでコンパイラ エラーが発生します。default:をキャッチする を使用するため、2 つ目は有効です.C

semver carthage(または Swift Package Manager) のサポートに準拠している場合、メジャー バージョンをインクリメントする必要がありますか?

これの拡張は、Objective-C (および暗黙的に C) に拡張されます。C 列挙は Swift 列挙として Swift でサポートされているため、これは Swift での使用を意図した Objective-C または C フレームワークにも適用されます。これらの言語にはそのような制限がないため、これを解決する方法がわかりません(コンパイラが優れている場合は警告のみ)。

4

1 に答える 1

5

回答: Swift で public enum に新しいケースを追加すると、重大な変更が発生します。

推論

セマンティック バージョニングは、一部の言語機能とは関係ありません。API の安定性に関するものです。
セマンティック バージョンは、主要な 3 つの部分 (1.0.1) で構成されます。

  • メジャー-下位互換性のない変更がパブリック API に導入された場合、インクリメントする必要があります
  • マイナー-下位互換性のある新しい機能がパブリック API に導入された場合は、インクリメントする必要があります。
  • パス-下位互換性のあるバグ修正のみが導入された場合は、インクリメントする必要があります

例:

この列挙型宣言を含むフレームワークがあるとします。

//Framework
public enum Enumeration {
    case A
    case B
}

これがそのフレームワークを使用するアプリです

//App 
let en = Enumeration.A
switch en {
    case .A: print("A")
    case .B: print("B")
}

変更の追加
次に、フレームワークにいくつかの変更を加えて、それが起こることを確認しましょう。列挙型に新しいケースを追加しましょう。

//Framework
public enum Enumeration {
    case A
    case B
    case C
}

Enumerationパブリック API であり、外部から見えるようになっています。これは、API を変更したことを意味します。メジャーまたはマイナー アップデートである必要があり、パッチは API が変更されていない場合です。

コンパイルしてアプリにしようとするとswitch、Swift では網羅的でなければならないため、失敗します。 ここに画像の説明を入力

そのため、API の破壊的な変更を行い、メジャー バージョンを増やす必要があります。1.0.1 -> 2.0.0

重要な注意点!

この問題は Swift 3 で処理されます
。この問題に関する Apple チームからの回答は次のとおりです。

ここに画像の説明を入力

これは、レジリエンス モデルの一部として処理されます。公開列挙型は、モジュール外では完全に一致しません。

于 2016-02-04T13:02:53.187 に答える