Перенос пользовательского типа в строку - PullRequest
0 голосов
/ 12 марта 2020

У меня есть пользовательский тип:

open class HashTag: Equatable {

    open var text: String
    open var isRemovable: Bool
    open var hasHashSymbol: Bool
    open var configuration: HashtagConfiguration?

    public init(word: String, withHashSymbol: Bool = true, isRemovable: Bool = true) {
        self.text = word
        self.isRemovable = isRemovable
        self.hasHashSymbol = withHashSymbol

        if hasHashSymbol {
            self.text = "#" + text
        }
    }

    public static func == (lhs: HashTag, rhs: HashTag) -> Bool {
        return lhs.text == rhs.text
    }
}

Я хочу перевести его в обычный массив String, а затем вернуть обратно. Например, для:

   var tags = [
                HashTag(word: "this"),
                HashTag(word: "is"),
                HashTag(word: "an"),
                HashTag(word: "example")
    ]

Я хочу перевести на

var tagsTransferred = ["this","is","an","example"]

И обратно:

var tagsTransferred = ["this","is","an","example"]

на:

   var tags = [
                HashTag(word: "this"),
                HashTag(word: "is"),
                HashTag(word: "an"),
                HashTag(word: "example")
    ]

Ответы [ 2 ]

1 голос
/ 12 марта 2020

Вы можете использовать функцию compactMap для обоих случаев.

  1. От [HashTag] до [String]

    var tags = [
        HashTag(word: "this"), 
        HashTag(word: "is"), 
        HashTag(word: "an"), 
        HashTag(word: "example")
    ]
    
    let arrString = tags.compactMap { (tag) -> String in
        tag.text.removeFirst() // This line just to remove "#"
        return tag.text
    }
    
  2. С [Строка] в [HashTag]

    var strings = ["this", "is", "an", "example"]
    
    let arrHashtag = strings.compactMap {
        return HashTag(word: $0)
    }
    
1 голос
/ 12 марта 2020

Метод map в Array предназначен для преобразования каждого элемента массива, т. Е. Именно того, что вы делаете.

Для преобразования [String] в [HashTag]:

let hashTagArray = stringArray.map { HashTag(word: $0) }

Чтобы преобразовать [HashTag] в [String]:

let stringArray = hashTagArray.map { $0.text }

Кроме того, если вы хотите, чтобы что-то подобное было возможно:

// the string array literal is automatically converted to [HashTag]
let hashTagArray: [HashTag] = ["this", "is", "an", "example"]

Вы можете сделать:

open class HashTag : Equatable, ExpressibleByStringLiteral {

    ...

    public typealias StringLiteralType = String
    public required convenience init(stringLiteral value: String) {
        self.init(word: value)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...