protocol
// protocol
protocol Printable {
    var type: String { get }
    var count : Int { get set}
    func printout()
}
class User : Printable{
    let name: String // property
    let type = "Laser"
    var count = 0
    init(_ name: String){
        self.name = name
    }
    func printout(){
        count += 1
        print("\(type): \(count)")
    }
}
let tom = User("tom")
tom.printout()
tom.printout()
tom.printout()
extension
// extension
extension String {
    var length: Int {
        return self.characters.count
    }
}
let msg = "hello"
print(msg.characters.count)
print(msg.length)
protocol Printable {
    func printout()
}
class User{
    let name: String // property
    init(_ name: String){
        self.name = name
    }
}
// extension
extension String {
    var length: Int {
        return self.characters.count
    }
}
let msg = "hello"
print(msg.characters.count)
print(msg.length)
protocol Printable {
    func printout()
}
extension Printable {
    func printout(){
        print("now printing...")
    }
}
class User: Printable{
    let name: String // property
    init(_ name: String){
        self.name = name
    }
}
let tom = User("tom")
tom.printout
値の参照
// Int, Double, Array .. ->値型
// Class -> 参照型
// var original = 10
// var copy = original // original
// original = 20
// print(original)
// print(copy)
class User{
    var name: String // property
    init(_ name: String){
        self.name = name
    }
}
var original = User("tom")
var copy = original // originalのデータが格納されている場所
original.name = "bob"
print(original.name)
print(copy.name)
構造体
// 構造体
// クラスと同機能
struct User{
    var name: String // property
    init(_ name: String){
        self.name = name
    }
    mutating func changeName(){
        self.name = name.Uppercased()
    }
}
var original = User("tom")
var copy = original // originalの値
original.name = "bob"
print(original.name)
print(copy.name)
// 列挙型
enum Direction {
    case right
    case left
}
// var dir: Direction
// // dir = Direction.right
// dir = .right
// switch(dir){
//     case .right:
//         print("right")
//     case .left:
//         print("left")
// }
enum Direction: Int {
    case right = 1
    case left = -1
}
print(Direction.right.rawValue)
	 
					 
