Mam następujący protokół i jego rozszerzenieSwift protokół z wiązanego typu - typ nie może odwoływać się jako wymóg
public protocol RESEndpointReachable: CustomDebugStringConvertible
{
associatedtype EndpointType: RESEndpointReachable
// MARK: - Properties
/// The name of the endpoint as defined in the REST URI.
var name: String { get }
/// An array of possible next endpoints that this endpoint can reach. E.g account's next endpoints would be authenticate and unauthenticate.
var nextPossibleEndpoints: [EndpointType] { get }
// MARK: - Ability
/// Used to process the endpoint.
func processRequest(request: RERequest)
/// Processes the next endpoint that matches the name `name`. Expects an endpoint with the name `name` to exist in `nextPossibleEndpoints`.
func processNextEndpointWithName(name: String, request: RERequest)
}
public extension RESEndpointReachable
{
// MARK: - CustomDebugStringConvertible
public var debugDescription: String {
return name
}
// MARK: - RESEndpointReachable
var nextPossibleEndpoints: [EndpointType] {
return []
}
public func processRequest(request: RERequest)
{
// Check all possible endpoints are being processed
if let nextEndpoint = nextPossibleEndpoints.first
{
fatalError("Unhandled endpoint \(nextEndpoint).")
}
}
public func processNextEndpointWithName(name: String, request: RERequest)
{
// Get the next endpoint that matches the specified name
let nextEndpoints = nextPossibleEndpoints.filter { $0.name == name }
if nextEndpoints.count > 1
{
fatalError("Multiple next endpoints found with the name '\(name)'.")
}
guard let nextEndpoint = nextEndpoints.first else
{
fatalError("No next endpoint with the name '\(name)'.")
}
// Process the next endpoint
nextEndpoint.processRequest(request)
}
}
Na budynku, linia associatedtype EndpointType: RESEndpointReachable
ma następujący błąd: Type may not reference itself as a requirement
. Ale jak rozumiem, w ten sposób używasz powiązanych typów w Swift.
Jak można się domyślić, zawsze chcę, aby to, co EndpointType
, zostało ustawione jako typ dziedziczący po RESEndpointReachable
.
Nie mam tej funkcji Ble teraz! Ref: https://gist.github.com/curtclifton/1923a47774a94e904bf0 https://forums.developer.apple.com/thread/15256. To sprawi, że kompilator będzie działał w pętlach rekursywnych – sargeras
Dzięki :) Pomyślałem, że może być tak ... Może w przyszłym miesiącu ... –