OctoberHammer
10/27/2017 - 11:56 AM

singleton vs Static functions

//: Playground - noun: a place where people can play

import UIKit
import Foundation
import PlaygroundSupport
//https://habrahabr.ru/post/103681/

protocol MyProtocol{
    //Можем объявить статическую функцию в протоколе
    static func someFunc()-> String
}


extension MyProtocol {
    //И реализовать ее в расширении
    static func someFunc()-> String {
        return "Hello, world"
    }
}
class MyClass {
    static func someFunc()-> String {
        return "Hello, world"
    }
}

print(MyClass.someFunc())

//Можем создать класс, который будет наследоваться - либо от протокола, либо от класса со стаnической функцией
class AnotherClass: MyProtocol {}
class ThirdClass: MyClass {}
//И статическая функция будет уже определена
print(AnotherClass.someFunc())
print(ThirdClass.someFunc())

//Либо мы ее сможем переопределить, при необходимости
class ForthClass: MyProtocol {
    func someFunc()-> String {
        return "Fervell, world"
    }
}


//В статье сказано, что инстанс (в случае синглотона) мы можем передавать в функции в качестве значения параметра, а "статический класс" не можем.
//Не знаю, что такое статический класс в Свифте (у меня не получилось сделать класс статическим), но если мы в какой-то функции хотим доступится только к статическим функциям какого-то класса, которые определены в протоколе, то делаем так
func someFunc(SomeClass:MyProtocol.Type) {
    print(SomeClass.someFunc())
}

//Придется сделать инлайн-инстанс, и от него взять тип.
someFunc(SomeClass: type(of: AnotherClass.init()))

//Ну сериализовать наверное действительно нельзя