Learn SwiftUI (Day 8/100)

RMAG news

Swift

functions with throw Exceptions

import Cocoa

enum PasswordError: Error, LocalizedError {
case TooShort
case Obvious

var errorDescription: String? {
switch self {
case .TooShort:
return NSLocalizedString(“Password is too short”, comment: “Too short”)
case .Obvious:
return NSLocalizedString(“Password is too obvious”, comment: “Obvious”)
}
}
}

// although defined with `throws`,
// this function doesn’t have to throw an exception
func checkPassword(_ pwd: String) throws -> Bool {
if pwd.count < 6 {
throw PasswordError.TooShort
}
if pwd == “123456” {
throw PasswordError.Obvious
}
return true
}

do {
let ok = try checkPassword(“hello”)
print(ok)
} catch {
print(“Error happened: (error.localizedDescription))
}

// ## Checkpoints

/*
write a function that accepts an integer from 1 through 10,000, and returns the integer square root of that number. That sounds easy, but there are some catches:

You can’t use Swift’s built-in sqrt() function or similar – you need to find the square root yourself.
If the number is less than 1 or greater than 10,000 you should throw an “out of bounds” error.
You should only consider integer square roots – don’t worry about the square root of 3 being 1.732, for example.
If you can’t find the square root, throw a “no root” error.
*/

enum RootError: Error, LocalizedError {
case outOfBounds
case noRoot

var errorDescription: String? {
switch self {
case .outOfBounds:
return NSLocalizedString(“Out of Bounds”, comment: “OOB”)
case .noRoot:
return NSLocalizedString(“No root”, comment: “NR”)
}
}
}

func sqroot(_ num: Int) throws -> Int {
if num < 1 || num > 10_000 {
throw RootError.outOfBounds
}
for i in 1100 {
if i * i == num {
return i
}
}
throw RootError.noRoot
}

do {
print(try sqroot(9))
print(try sqroot(25))
print(try sqroot(37))
} catch {
print(“error happened: (error.localizedDescription))
}

Leave a Reply

Your email address will not be published. Required fields are marked *