私はそれが実際に何が悪かったのかについての情報を破棄していますので、あなたは、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
}
}
エラーを表示するか、条件が成立していないかどうかを確認してインスタンスを作成しないようにしたいですか? – mihatel