You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
// // Copyright © 2019 Swinject Contributors. All rights reserved. //
import Foundation
// MARK: ServiceKeyOption
public protocol ServiceKeyOption: CustomStringConvertible { func isEqualTo(_ another: ServiceKeyOption) -> Bool func hash(into: inout Hasher) }
// MARK: - ServiceKey
internal struct ServiceKey { internal let serviceType: Any.Type internal let argumentsType: Any.Type internal let name: String? internal let option: ServiceKeyOption? // Used for SwinjectStoryboard or other extensions.
internal init( serviceType: Any.Type, argumentsType: Any.Type, name: String? = nil, option: ServiceKeyOption? = nil ) { self.serviceType = serviceType self.argumentsType = argumentsType self.name = name self.option = option } }
// MARK: Hashable
extension ServiceKey: Hashable { public func hash(into hasher: inout Hasher) { ObjectIdentifier(serviceType).hash(into: &hasher) ObjectIdentifier(argumentsType).hash(into: &hasher) name?.hash(into: &hasher) option?.hash(into: &hasher) } }
// MARK: Equatable
func == (lhs: ServiceKey, rhs: ServiceKey) -> Bool { return lhs.serviceType == rhs.serviceType && lhs.argumentsType == rhs.argumentsType && lhs.name == rhs.name && equalOptions(opt1: lhs.option, opt2: rhs.option) }
private func equalOptions(opt1: ServiceKeyOption?, opt2: ServiceKeyOption?) -> Bool { switch (opt1, opt2) { case let (opt1?, opt2?): return opt1.isEqualTo(opt2) case (nil, nil): return true default: return false } }
|