Swiftレース知識ポイント

5806 ワード

おおよその内容
再帰、例外、インデックス、ブレークスルー
再帰
// 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