Что означает ~› (тильда больше) в этом коде Swift?

Я конвертирую код, который не принадлежит мне, в swift 3.0, и есть некоторые строки, которые я не понимаю, которые помечаются компилятором:

public func setupAppearance()
{
    if let delegate = delegate
    {
        firstWeekday~>delegate.firstWeekday?()
        dayOfWeekTextColor~>delegate.dayOfWeekTextColor?()
        dayOfWeekTextUppercase~>delegate.dayOfWeekTextUppercase?()
        dayOfWeekFont~>delegate.dayOfWeekFont?()
        weekdaySymbolType~>delegate.weekdaySymbolType?()
    }
}

ПРИМЕЧАНИЕ: это не -> (тире, больше), а ~> (тильда, больше)

Я нашел этот вопрос: Что такое ~ > (тильда больше чем), используемый в Swift?, но не нашел его очень полезным.

Может ли кто-нибудь указать мне документы о том, как это читать? К сожалению, google, stackoverflow и github не могут искать ~>.

Спасибо

Грег


person Greg Robertson    schedule 13.07.2016    source источник
comment
Кто-то создал собственный оператор (или, лучше сказать, переделал существующий оператор, чтобы он означал что-то другое, что еще хуже). Command-щелкните по нему и посмотрите, куда он вас приведет. (Одна из причин, по которой я не одобряю использование пользовательских операторов…)   -  person Rob Napier    schedule 14.07.2016
comment
@RobNapier ~> не является существующим оператором, так что вы имеете в виду?   -  person Tim Vermeulen    schedule 14.07.2016
comment
Это действительно так. У него просто нет публичных реализаций. Он определяется как оператор в заголовке Swift. Если я правильно помню, его можно использовать как деталь реализации случаев переключения.   -  person Rob Napier    schedule 14.07.2016
comment
@TimVermeulen http://swiftdoc.org/v3.0/operator/tildegt/.   -  person dfrib    schedule 14.07.2016
comment
Я нашел это: natecook.com/blog/2014/ 11/swifts-elusive-tilde-gt-operator   -  person Greg Robertson    schedule 14.07.2016


Ответы (2)


Я полагаю, что первоначальный разработчик использовал пользовательский оператор Swift для маршалинга потоков от iJoshSmith.

func ~> <R> (
    backgroundClosure: () -> R,
    mainClosure:       (result: R) -> ())
{
    dispatch_async(queue) {
        let result = backgroundClosure()
        dispatch_async(dispatch_get_main_queue(), {
            mainClosure(result: result)
        })
    }
}
person Christian Abella    schedule 13.07.2016
comment
Итак, если я правильно понимаю, этот код использует недокументированную функцию Swift для копирования всей структуры данных из одного объекта в другой, и это делается в основном потоке? - person Greg Robertson; 14.07.2016
comment
Что делает пользовательский оператор Swift, так это то, что он выполняет левостороннее закрытие в фоновом потоке, а когда это завершается, он выполняет правостороннее закрытие в основном потоке. Вы также можете проверить свой исходный код, если он действительно использует эту библиотеку или первоначальный автор вашего кода создал свою собственную реализацию этого оператора. - person Christian Abella; 15.07.2016
comment
Это правильный ответ, поскольку они создали свой собственный оператор: infix operator ~› { } public func ~›‹T: Any›(lhs: inout T?, rhs: T?) -> T? { if lhs != nil && rhs != nil { lhs = rhs } return lhs } - person Greg Robertson; 15.07.2016

Я считаю, что это побитовые НЕ операторы. См. здесь: https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/AdvancedOperators.html

Побитовый оператор НЕ (~) инвертирует все биты в числе.

person Skua    schedule 13.07.2016
comment
Это просто ~, а не ~>. - person Tim Vermeulen; 14.07.2016