2017-12-14 11 views
2

私にクラスがあるとします。私は私のクラスは説明のルールアサートによるエラー処理

class Puzzle { 

var puzzle_array: [Int] 
var zero_index: Int 

public init(array: [Int]) { 
    assert(array.count == 9, "Array should be lenght 9") 
    assert(array.index(of: 0) != nil, "There should ne 0 in array") 
    puzzle_array = array 
    zero_index = puzzle_array.index(of: 0)! 
} 
} 

に従わない場合initにエラーを与えたい は、それから私は、ループ内で、このクラスの複数のインスタンスを作成する必要があります。それらのうちのいくつかは、条件を満たしていない、私はinitとcomplierで説明し、私はエラーが発生します。 私が望むのは、エラーを実行せずにこのインスタンスの作成をスキップすることです。そして、私はinitの中で条件論理をチェックし続けたいと思います。

私の最初のアイデアは間違っているかもしれませんが、より適切に作れるように助けていただければ幸いです。

+0

エラーを表示するか、条件が成立していないかどうかを確認してインスタンスを作成しないようにしたいですか? – mihatel

答えて

1

これを達成するためにfailable initialiserを使用すると、チェックを満たさない場合、オブジェクトはゼロになります。

class Puzzle { 
    var puzzle_array: [Int] 
    var zero_index: Int 

    public init?(array: [Int]) { 
    guard array.count == 9, array.index(of: 0) != nil else { 
     return nil 
    } 

    puzzle_array = array 
    zero_index = puzzle_array.index(of: 0)! 
    } 
} 
1

私はそれが実際に何が悪かったのかについての情報を破棄していますので、あなたは、failable initialiserを使用する必要があります@colmgに反対。

代わりにあなたがthrowable initalizerを使用する必要があります。

assertは標準ここバージョンが、この関数ではありませんと仮定すると
class Puzzle { 
    var puzzle_array: [Int] 
    var zero_index: Int 

    public init(array: [Int]) throws { 
     try assert(array.count == 9, "Array should be lenght 9") 
     try assert(array.index(of: 0) != nil, "There should ne 0 in array") 
     puzzle_array = array 
     zero_index = puzzle_array.index(of: 0)! 
    } 
} 

do { 
    let puzzle = try Puzzle([0, 1, 2, 3, 4]) 
} catch let error { 
    // Here you can handle error, and see what exactly went wrong, instead of just knowing that initialisation failed 
} 

:今、あなたはこれを行うことができます

struct AssertError: Error { 
    let description: String 
} 

func assert(_ condition: @autoclosure() -> Bool, _ description: String) throws { 
    if !condition() { 
     throw AssertError(description: description) 
    } 
} 

または、より高度なバージョンを使用することができます:

func assert(_ condition: @autoclosure() -> Bool, _ error: Error) throws { 
    if !condition() { 
     throw error 
    } 
} 

class Puzzle { 
    var puzzle_array: [Int] 
    var zero_index: Int 

    public init(array: [Int]) throws { 
     try assert(array.count == 9, PuzzleError.invalidArrayLength) 
     try assert(array.index(of: 0) != nil, PuzzleError.arrayContainsZero) 
     puzzle_array = array 
     zero_index = puzzle_array.index(of: 0)! 
    } 

    enum PuzzleError: Error { 
     case invalidArrayLength 
     case noZeroInArray 
    } 
}