Skip to content

Instantly share code, notes, and snippets.

@KentarouKanno
Last active January 1, 2016 17:06
Show Gist options
  • Save KentarouKanno/ddd58e75e6c0b2a6fcf5 to your computer and use it in GitHub Desktop.
Save KentarouKanno/ddd58e75e6c0b2a6fcf5 to your computer and use it in GitHub Desktop.
Protocol

Protocol conform

★ 構造体にBooleanTypeを準拠させる

struct Mystruct { }

let myStruct = Mystruct()

if myStruct {
    print("true")
} else {
    print("false")
}

// Boolean Type
extension Mystruct: BooleanType {
    var boolValue: Bool { return false }
}

★ 構造体にsubscriptを準拠させる

struct Mystruct {
    var arrayValue: Array<String> = []
}

// Subscript
extension Mystruct {
    
    subscript(index: Int) -> String {
        get {
            return arrayValue[index]
        }
        set {
            arrayValue.insert(newValue, atIndex: index)
        }
    }
    
    subscript(index: String) -> String {
        get {
            return "get String Value"
        }
        // Setterは無くてもOK
        set {
            
        }
    }
    
    subscript(index: AnyObject?) -> String {
        return "get AnyObject"
    }
}

var myStruct = Mystruct()
myStruct[0] = "value1"
myStruct[1] = "value2"

var value = myStruct[1]
//=> value2

var getString = myStruct["a"]
//=> "get String Value"

var anyObj = myStruct[Array([1,2,3])]
//=> "get AnyObject"

var anyNil = myStruct[nil]
//=> "get AnyObject"

★ 構造体にSequenceTypeを準拠させる

struct Mystruct {}

struct MystructGenerator: GeneratorType {
    typealias Element = Int
    
    var index = 1
    mutating func next() -> Element? {
        
        if index > 5 { return nil }
        return index++
    }
}

extension Mystruct: SequenceType {
    
    typealias Generator = MystructGenerator
    func generate() -> Generator {
        return Generator()
    }
}

var myStruct = Mystruct()

let value = myStruct.map ({ $0 })
//=> [1, 2, 3, 4, 5]

for element in myStruct {
    print(element)
}

//=>
1
2
3
4
5

★ 構造体にCollectionTypeを準拠させる

struct Mystruct {}

struct MystructGenerator: GeneratorType {
    typealias Element = Int
    
    var index = 1
    mutating func next() -> Element? {
        
        if index > 5 { return nil }
        return index++
    }
}

extension Mystruct: SequenceType {
    
    typealias Generator = MystructGenerator
    func generate() -> Generator {
        return Generator()
    }
}

extension Mystruct: CollectionType {
    // public protocol CollectionType : Indexable, SequenceType
}

extension Mystruct : Indexable {
    
    typealias Index = Int
    var startIndex: Index { return 1 }
    var endIndex: Index { return 6 }
    
    subscript (position: Index) -> Generator.Element {
        return position
    }
}

var myStruct = Mystruct()

var first = myStruct.first
//=> Optional(1)

var isEmpty = myStruct.isEmpty
//=> false

for value in myStruct.startIndex ..< myStruct.endIndex {
    print(value)
}

//=>
1
2
3
4
5

★ 構造体にCustomStringConvertibleを準拠させる

struct Mystruct {}

extension Mystruct: CustomStringConvertible {
    var description: String {
        return "Mystruct Descrioption"
    }
}

var myStruct = Mystruct()
print(myStruct)
//=> Mystruct Descrioption

var optionalMyStruct: Mystruct? = Mystruct()
print(optionalMyStruct)
//=> Optional(Mystruct Descrioption)

★ 構造体にEquatableを準拠させる

struct Mystruct {
    var arrayValue: Array<String> = []
}

extension Mystruct: Equatable {
    
}

func == (a: Mystruct, b: Mystruct) -> Bool {
    return a.arrayValue.count == b.arrayValue.count
}


var myStruct: Mystruct? = Mystruct()
myStruct!.arrayValue = ["a", "b", "c"]

var myStruct1: Mystruct? = Mystruct()
myStruct1!.arrayValue = ["a", "b"]

if myStruct == myStruct1 {
    print("Equal")
} else {
    print("Not Equal")
}
//=> "Not Equal"

★ 構造体にComparableを準拠させる

struct Mystruct {}

func == (a: Mystruct, b: Mystruct) -> Bool {
    return true
}

extension Mystruct: Equatable {}

func < (lhs: Mystruct, rhs: Mystruct) -> Bool {
    return true
}

func <= (lhs: Mystruct, rhs: Mystruct) -> Bool {
    return true
}

func >= (lhs: Mystruct, rhs: Mystruct) -> Bool {
    return true
}

func > (lhs: Mystruct, rhs: Mystruct) -> Bool {
    return true
}

extension Mystruct: Comparable {}


var myStruct: Mystruct? = Mystruct()
var myStruct1: Mystruct? = Mystruct()

if myStruct > myStruct1 {
    print("Equal")
}
//=> Equal

if myStruct < myStruct1 {
    print("Equal")
}
//=> Equal

if myStruct >= myStruct1 {
    print("Equal")
}
//=> Equal

if myStruct <= myStruct1 {
    print("Equal")
}
//=> Equal
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment