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.
 
 
 
 

61 lines
1.6 KiB

//
// 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
}
}