В SwiftData тип Predicate
использует пакеты параметров:
struct Predicate<each Input>
Теперь я хочу добавить метод расширения для Predicate
, который доступен только в том случае, если общий параметр имеет тип SomeType
:
@Model
class SomeType {
var someVar: Int
}
Я пытался заставить его работать, но он выдает различные ошибки:
extension Predicate where Input == SomeType { }
Ссылка на пакет «Вход» требует расширения с помощью ключевого слова «повторить».
Пакет типов «Вход» должен ссылаться на «каждый».
extension Predicate where each Input == SomeType { }
Ссылка на пакет «Вход» требует расширения с помощью ключевого слова «повторить».
extension Predicate where repeat each Input == (SomeType) { }
Требования к одному и тому же элементу пока не поддерживаются.
Как я могу добавить эту функцию как статическую функцию Predicate<each Input>
где Input == SomeType
?
static func predicateMatchingNegativeSomeVars() -> Predicate<SomeType> {
#Predicate<SomeType> {
$0.someVar < 0
}
}
В SE-0393 на самом деле упоминается синтаксис, аналогичный тому, который вы пытались использовать в разделе Будущие направления. На данный момент это не реализовано.
Но благодаря SE-361 вы можете просто сделать
extension Predicate<SomeType> {
static func predicateMatchingNegativeSomeVars() -> Predicate<SomeType> {
#Predicate<SomeType> {
$0.someVar < 0
}
}
}
Тем не менее, поскольку метод, который вы хотите добавить, в любом случае — это static
, вам не нужна эта привязка — вместо этого просто напишите extension Predicate { ... }
. Это нужно только в том случае, если вы добавляете членов экземпляра.
@iSpain17 Да, интересно. Вероятно, языковой сервер просто не понимает пакеты параметров, не связанные с синтаксисом, используемым для объявления расширения.
Однако это отображается во время завершения кода для
Predicate
, гдеInput
нетSomeType
.