Swift закрытия соответствуют typealias, включая любой - PullRequest
0 голосов
/ 24 мая 2019

У меня есть два объявления typealias

typealias QueryClosure = ((UInt?,UInt?)->([URLQueryItem])?)?
typealias SearchClosure = ((String?,UInt?)->([URLQueryItem])?)?

И я создал закрытие для этих

var queryFunc: (QueryClosure)? = ( {a,b in
    return [URLQueryItem(name: "limit", value: "\(a ?? defaultPageSize)"), URLQueryItem(name: "offset", value: "\( (b ?? defaultPageIndex) * (a ?? defaultPageSize) )")]
})

var searchFunc: (SearchClosure)? = ( {query,b in
    return [URLQueryItem(name: "q", value: query), URLQueryItem(name: "page", value: "\(b ?? defaultPageIndex)")]
    }
)

Теперь я не хочу передавать ни запрос, ни поисковое закрытие, я хочучтобы пройти общее закрытие.

Итак, я создал новый typealias

typealias VariableClosure = ((Any?, Any?)->([URLQueryItem]))?

Но я не могу преобразовать в этот тип

let search : (VariableClosure) = ( {query,b in
    return [URLQueryItem(name: "q", value: query), URLQueryItem(name: "page", value: "\(b ?? defaultPageIndex)")]
    }
)

Это дает мнеошибка в том, что

Cannot convert value of type '(String?, _) -> [URLQueryItem]' to specified type 'VariableClosure' (aka 'Optional<(Optional<Any>, Optional<Any>) -> Array<URLQueryItem>>')

Как я могу создать замыкание (или лучше два), которое соответствует переменной переменная typealias, или каким-либо другим способом иметь своего рода общие typealias, которым я могу передать свои замыкания.

1 Ответ

1 голос
/ 24 мая 2019

Поскольку URLQueryItem принимает String и переменную query, которую вы передаете, имеет тип Any, вы должны сначала от typecast query до String, прежде чем ее использовать.

То же самое относится и к переменной b.Вы должны typecast до Int перед использованием.

let search: VariableClosure = {query,b in
    if let query = query as? Int, let b = b as? Int {
        return [URLQueryItem(name: "limit", value: "\(query ?? 10)"), URLQueryItem(name: "offset", value: "\( (b ?? 10) * (query ?? 10) )")]
    } else if let query = query as? String, let b = b as? Int {
        return [URLQueryItem(name: "q", value: query), URLQueryItem(name: "page", value: "\(b ?? 1)")]
    }
    return nil
}

В приведенном выше случае, если вы ожидаете также query и b других типов, вы должны обработать их вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...