четверг, 2 июля 2020 г.

Swift, Protocols, Standard Library

Online Swift Playground 

//Equatable
struct Point{
    var x: Int
    var y: Int
}

extension Point: Equatable {
    static func ==(lhs: Point, rhs: Point) -> Bool {
        lhs.x == rhs.x && lhs.y == rhs.y
    }
}

var p1 = Point(x:1, y:1)
var p2 = p1
print("p1 equal p2: \(p1 == p2)")

//Comparable
extension Point: Comparable {
    static func <(lhs: Point, rhs: Point) -> Bool {
        if lhs.x == rhs.x {
        return lhs.y < rhs.y
        }
        return lhs.x < rhs.x
    }
}

var p3 = Point(x:3, y:3)
print("max: \(p1 < p3 ? p3 : p1)")

var p4 = Point(x:4, y:4)
var p5 = Point(x:5, y:5)

var pArr = [p5, p2, p1, p4, p3]
print(pArr)
pArr.sort()
print(pArr)
print(pArr.max()!)
print(pArr.min()!)
print(pArr.contains(p1))
print(pArr.starts(with: [p1, p2]))
pArr.reverse()
print(pArr)

//Hashable
class Person: Hashable{
    let name: String

    init(name: String){
        self.name = name
    }

    static func ==(lhs: Person, rhs: Person) -> Bool {
        lhs.name == rhs.name
    }
  
    func hash(into hasher: inout Hasher) {
        hasher.combine(name)
    }
}

let person = Person(name: "Mike")
let dic1 = [person: "1973"]
print(dic1)

//CustomStringConvertible, CustomDebugStringConvertible
extension Person: CustomStringConvertible {
    var description: String {
        "\(name)"
    }
}
print(dic1)

extension Person: CustomDebugStringConvertible {
    var debugDescription: String {
        "Person: \(name)"
    }
}
debugPrint(dic1)

Комментариев нет:

Отправить комментарий