Swiftレース知識ポイント
5806 ワード
おおよその内容
再帰、例外、インデックス、ブレークスルー
再帰
異常
Fractionスコアクラス
テスト
索引
例1
フラグメントコード、gobangAppの改良版を詳しく参照
テスト
例2:ランダム検証コードの生成
断言する
ある条件が満たされているかどうかを判断する必要がある場合は、アサーションassertを使用して、条件を満たすプログラムを実行し続け、満たさない場合はカンマの後ろの内容を提示します.
再帰、例外、インデックス、ブレークスルー
再帰
// C(m,n) m!/n!/(m-n)! = m!/(n!*(m-n)!) n*(n-1)!
func Cmn(m:Int, _ n:Int) ->Int{
assert(m >= n,"m n")// ,m n "m n"
return Int(a3(m) / a3(n) / a3(m - n))
}
/*
//n*(n-1)! ,
func f(n:Int) -> Double{
if n == 0 || n == 1{
return 1
} //
return Double(n) * f(n - 1)//
}
// ( ), , , ,
//
//1.
//2.
*/
// 1-n
func sum(n:Int) -> Int{
if n == 1{
return 1
}
return n + sum(n - 1)
}
異常
Fractionスコアクラス
//x y y%x ( )
//
func gcd(x:Int, _ y:Int) ->Int{
if x > y{
return gcd(y, x)
}
else if y % x != 0{
return gcd(y % x, x)
}
else {
return x
}
}
// ErrorType
// case
/**
- ZeroDenominator: 0
- DividByZero: 0
*/
enum FractionError:ErrorType{
case ZeroDenominator,DividByZero
}
class Fraction{
private var _num:Int //
private var _den:Int //
// , throws
init(num:Int,den:Int) throws {
_num = num
_den = den
//
// throw ErrorType
if _den == 0{
throw FractionError.ZeroDenominator
}
else{
normoalize()
simplify()
}
}
var info:String{
get {
return _num == 0 || _den == 1 ? "\(_num)" : "\(_num)/\(_den)"
}
}
func add(other:Fraction) throws -> Fraction{
return try Fraction(num: _num * other._den + other._num * _den, den: _den * other._den)
}
func sub(other:Fraction) throws ->Fraction{
return try Fraction(num: _num * other._den - other._num * _den, den: _den * other._den)
}
func mul(other:Fraction) throws ->Fraction{
return try Fraction(num: _num * other._num, den: _den * other._den)
}
func div(other:Fraction) throws ->Fraction{
if other._num == 0{
throw FractionError.DividByZero
}
return try! Fraction(num: _num * other._den, den: _den * other._num)
}
func normoalize() ->Fraction{
if _den < 0{
_num = -_num
_den = -_den
}
return self
}
func simplify() ->Fraction{
if _num == 0{
_den = 1
}
else{
let x = abs(_num)
let y = abs(_den)
let g = gcd(x, y)
_num /= g
_den /= g
}
return self //
}
}
// ( )
func +(one:Fraction,two:Fraction) -> Fraction{
// try !
// do...catch
return try! one.add(two)
}
func -(one:Fraction,two:Fraction) -> Fraction{
return try! one.sub(two)
}
func *(one:Fraction,two:Fraction) -> Fraction{
return try! one.mul(two)
}
func /(one:Fraction,two:Fraction) throws -> Fraction{
return try one.div(two)
}
テスト
// do...catch
// try,
// do catch
// do , , catch
// do catch , catch
do {
let f1 = try Fraction(num: 3, den: 0)
let f2 = try Fraction(num: 0, den: 5)
let f3 = f1 + f2
print(f3.info)
let f4 = f1 - f2
print(f4.info)
let f5 = f1 * f2
print(f5.info)
let f6 = try f1 / f2
print(f6.info)
}
catch FractionError.ZeroDenominator{
print(" 0")
}
catch FractionError.DividByZero{
print(" 0")
}
catch{
print(" , ")
}
// do...catch
func foo(){
// try !
// ?
// ? optional
// :
// 1. :xxx!
// 2. : if let = xxx
let f1 = try? Fraction(num: 3, den: 0)
let f2 = try? Fraction(num: 0, den: 5)
// let c = f1! + f2! //
//
if let a = f1, b = f2{
let c = a + b
print(c.info)
}
else{
print(" ")
}
}
索引
例1
フラグメントコード、gobangAppの改良版を詳しく参照
// ****
subscript(row:Int,col:Int) -> Bool{
get{ return board[row][col] == .Space }
set(isBlack){
if board[row][col] == .Space{
board[row][col] = isBlack ? .Black : .White
isBlackTurn = !isBlackTurn
}
}
}
テスト
if board[row,col]{
board[row,col] = board.isBlackTurn
setNeedsDisplay()
}
例2:ランダム検証コードの生成
func randomNum(min:Int,_ max:Int) -> Int{
return Int(arc4random_uniform(UInt32(max - min)) + 1) + min
}
// API
extension String{
var lenth: UInt32 {
get{ return UInt32(self.characters.count) }
}
//
subscript(index:Int) -> Character{
get { return self[self.startIndex.advancedBy(index)] }
}
}
func generate(lenth:Int) ->String{
var code = ""
if lenth > 0{
let str = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
for _ in 0..
断言する
ある条件が満たされているかどうかを判断する必要がある場合は、アサーションassertを使用して、条件を満たすプログラムを実行し続け、満たさない場合はカンマの後ろの内容を提示します.
let age = -3
assert(age >= 0, "A person's age cannot be less than zero")
// this causes the assertion to trigger, because age is not >= 0