★ 構造体に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