2016-04-07 9 views
-2

Я хочу преобразовать массив пользователей в строку их имен.Swift: преобразовать массив объектов в строку?

Например:

class User { 
    var name: String 

    init(name: String) { 
     self.name = name 
    } 
} 

let users = [ 
    User(name: "John Smith"), 
    User(name: "Jane Doe"), 
    User(name: "Joe Bloggs") 
] 
  1. Это хороший способ получить String: "John Smith, Jane Doe, Joe Bloggs"?

    let usersNames = users.map({ $0.name }).joinWithSeparator(", ") 
    
  2. Что делать, если я хочу, чтобы последняя запятая была амперсандом? Есть ли быстрый способ сделать это, или мне нужно будет написать собственный метод?

+0

Связанный: http://stackoverflow.com/questions/8586141/implode-array-with-and-add-and-before-last-item – ma11hew28

ответ

-1
  1. Вы можете использовать reduce:

    users.reduce("", combine: { ($0.isEmpty ? "" : $0 + ", ") + $1.name }) 
    
  2. Попробуйте это:

    func usersNames() -> String { 
        var usersNames = users[0].name 
        if users.count > 1 { 
         for index in 1..<users.count { 
          let separator = index < users.count-1 ? ", " : " & " 
          usersNames += separator + users[index].name 
         } 
        } 
        return usersNames 
    } 
    
+0

правильно, потому что он, отвечая на первый вопрос , – ma11hew28

+0

ОК. Ничего страшного. Благодаря! :-) – ma11hew28

1

Вы можете создать вычисляемое свойство. Попробуйте так:

class User { 
    let name: String 
    required init(name: String) { 
     self.name = name 
    } 
} 

let users: [User] = [ 
    User(name: "John Smith"), 
    User(name: "Jane Doe"), 
    User(name: "Joe Bloggs") 
] 

extension _ArrayType where Generator.Element == User { 
    var names: String { 
     let people = map{ $0.name } 
     if people.count > 2 { return people.dropLast().joinWithSeparator(", ") + " & " + people.last! } 
     return people.count == 2 ? people.first! + " & " + people.last! : people.first ?? "" 
    } 
} 

print(users.names) // "John Smith, Jane Doe & Joe Bloggs\n" 
Смежные вопросы