Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Получить основной текст из URL-адреса сообщения в Swift

Автор вопроса: iphaawОтветов: 1

Этот вопрос следует из вопроса: Перетащите сообщения из Mail в Dock с помощью Swift

Теперь я получил сообщение перетаскивания при перетаскивании сообщения из Mail в док-станцию. Единственное, что я получаю, это заголовок сообщения и URL-адрес сообщения следующим образом:

сообщение:%[email protected]%3E

Как получить основной текст с этого URL-адреса?

Спасибо

Андрей

swifturlmessageapple-mail

Ответы

Ответ 1 · рейтинг 3 · Bruno Philipe

Для этого можно использовать простое регулярное выражение.

Параметр .* является голодным и будет пытаться максимально соответствовать паре url subject:message до (надеюсь) последнего символа @ в строке.

Я также включил небольшую инструментальную функцию (rangeFromNSRange()), чтобы помочь преобразовать структуру Objective-C NSRange в правильную структуру Range<String.Index> Swift.

Вставьте следующее в игровую площадку Swift, чтобы увидеть, как это работает (и получайте удовольствие!):

import Cocoa

func rangeFromNSRange(range: NSRange, string: String) -> Range<String.Index>
{
    let startIndex = string.startIndex.advancedBy(range.location)
    let endIndex = startIndex.advancedBy(range.length)
    return Range(start: startIndex, end: endIndex)
}

func parseEmailURL(urlAsString url: String) -> (subject: String, message: String)?
{
    let regexFormat = "^(.*):(.*)@"
    if let regex = try? NSRegularExpression(pattern: regexFormat, options: NSRegularExpressionOptions.CaseInsensitive)
    {
        let matches = regex.matchesInString(url, options: NSMatchingOptions(rawValue: 0), range: NSMakeRange(0, url.characters.count))

        if let match = matches.first
        {
            let subjectRange = rangeFromNSRange(match.rangeAtIndex(1), string: url)
            let messageRange = rangeFromNSRange(match.rangeAtIndex(2), string: url)

            let subject = url.substringWithRange(subjectRange)
            let message = url.substringWithRange(messageRange)

            return (subject, message)
        }
    }

    return nil
}

parseEmailURL(urlAsString: "message:[email protected]")

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы