Swift Extension

/*  

    Extension

 

*/


class C{}


protocol someProtocol{}

protocol anotherProtocol{}


// extend protocol conformance


extension C:someProtocol,anotherProtocol{

    //do something to conform the protocol

}


// extend computed property


extension C{

    var number:Int{

        return self.number*2

    }

}


extension Double{

    var km :Double { return self * 1_000.00 }

}


var qianmi = 25.3.km

print(qianmi)


/*  extend initializer,

    only convenience initializer for class not for struct

*/


/*


struct Point{

    var x=0,y=0

}

struct Size{

    var long=5,width=5

}


struct Rect{ // if I put class here it will fail

    var point:Point=Point()

    var size:Size=Size()

}




extension Rect{

    init(center:Point,size:Size){

        let orix=center.x - (size.long/2)

        let oriy=center.y - (size.width/2)

        self.init(point:Point(x:orix,y:oriy),size:size)

    }

}

 

 

*/


struct Size {

    var width = 0.0, height = 0.0

}

struct Point {

    var x = 0.0, y = 0.0

}

class Rect {

    var origin = Point()

    var size = Size()

}


extension Rect {

    convenience init(center: Point, size: Size) {

        let originX = center.x - (size.width / 2)

        let originY = center.y - (size.height / 2)

        self.init(center: Point(x: originX, y: originY), size: size)

    }

}



/*

    Extension on method

 

*/


extension Int{

    func repetitions(foo:()->Void){

        for _ in 0..<self{

            foo()

        }

    }

}


extension String{

    func foo(){

        print(self + self)

    }

}


var a="god damn it"


a.foo()

a.self


3.self


3.repetitions {

    print("hey")

    //print(self)

    // because this code block don't belong to 3 itself

    // hence you can't put self here, because it's undeclared

}



// Extension on method to mutate instance itself


extension Int{

     mutating func double(){

        self=self*2 // because by default, self is immutable

    }

}



/*

    extension for subscript

 */


extension Int{

    subscript(index:Int) -> Int {

        var decimalBase = 1

        for _ in 0 ..< index{

            decimalBase *= 10

        }

        return (self/decimalBase)%10

    }

}


12345[0]

12345[1]



extension Int{

    enum Kind{

        case negative,zero,positive

    }

    var kind:Kind{

        switch self{

        case 0:

            return .zero

        case let x where x > 0:

            return .positive

        default:

            return .negative

        }

    }

}


func printType(_ numbers: [Int]){

    for i in numbers{

        switch i.kind {

        case .negative:

            print("- ",terminator:"")

        case .positive:

            print("+ ",terminator:"")

        case .zero:

            print("0 ",terminator:"")

        }

    }

}


printType([-2,51,0,542,-4])


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值