Swift Components (Разделяет: _) не работает [дубликат]

Мое решение находится в T-SQL без каких-либо опорных точек:

SELECT
    CompanyName,  
    SUM(CASE WHEN (action='EMAIL') THEN 1 ELSE 0 END) AS Email,
    SUM(CASE WHEN (action='PRINT' AND pagecount=1) THEN 1 ELSE 0 END) AS Print1Pages,
    SUM(CASE WHEN (action='PRINT' AND pagecount=2) THEN 1 ELSE 0 END) AS Print2Pages,
    SUM(CASE WHEN (action='PRINT' AND pagecount=3) THEN 1 ELSE 0 END) AS Print3Pages
FROM 
    Company
GROUP BY 
    CompanyName
76
задан confile 13 April 2015 в 22:06
поделиться

10 ответов

Это еще проще в Swift:

let string : String = "Hello                   
213
ответ дан Martin R 21 August 2018 в 20:49
поделиться
  • 1
    Вы не знаете, зачем пытаться присоединиться (let joined = ", ".join(characters);), массив приводит к ошибке 'String' is not identical to 'Character'? – Mohamad 3 January 2015 в 22:55
  • 2
    @Mohamad: Перечисление строки создает последовательность символов, но ", ".join(...) ожидает массив строк. Ответ devxoul ниже показывает, как вы могли бы разбить на массив строк. – Martin R 3 January 2015 в 23:07
  • 3
    @Fonix: characters представляет собой набор и представление для символов строк. Создание массива из символов делает копию. - Конечно, вы можете напрямую обращаться к персонажам: for i in string.characters.indices { print(string.characters[i]) } или просто for c in string.characters { print(c) } – Martin R 28 February 2017 в 07:52
  • 4
    @Fonix: ... С другой стороны, случайное индексирование в строки может быть медленным, и может быть полезно создать массив со всеми символами один раз. Пример: stackoverflow.com/questions/40371929/… . – Martin R 28 February 2017 в 07:55
  • 5
    @DaniSpringer: Swift 4 в настоящее время находится в стадии бета-тестирования, вам понадобится Xcode 9 beta: developer.apple.com/swift/resources . – Martin R 13 August 2017 в 16:10

Мартин R ответ - лучший подход, и, как он сказал, поскольку String соответствует протоколу SquenceType, вы также можете перечислять строку, получая каждый символ на каждой итерации.

let characters = "Hello"
var charactersArray: [Character] = []

for (index, character) in enumerate(characters) {
    //do something with the character at index
    charactersArray.append(character)
}

println(charactersArray)
2
ответ дан Alberto Barrera 21 August 2018 в 20:49
поделиться
  • 1
    Или просто for character in characters { charactersArray.append(character)} без enumeration() – Tieme 14 November 2014 в 14:40

Нашел другой способ, используя String.CharacterView.Thought я мог бы поделиться

var reversedText:String = "reversed"
let characters = (reversedText.characters.reversed()).reversed
print(characters)

Также работает, но я предпочитаю решение Martin R.

0
ответ дан BCI 21 August 2018 в 20:49
поделиться

Изменить (Swift 4)

В Swift 4 вам не нужно использовать characters для использования map(). Просто map() на String.

"ABC".map { String($0) }
print(letters) // ["A", "B", "C"]
print(type(of: letters)) // Array<String>

Или, если вы предпочитаете более короткое: "ABC".map(String.init) (2-байты

71
ответ дан devxoul 21 August 2018 в 20:49
поделиться
  • 1
    Немного короче: arr = map(str) { String($0) } – Martin R 3 January 2015 в 23:08
  • 2
    Вместо этого используйте инициализатор Array: Array("ABC".characters) – chrisamanse 30 September 2016 в 13:42
  • 3
    @chrisamanse. Между "ABC".characters и Array("ABC".characters) нет разницы. – devxoul 30 September 2016 в 17:08
  • 4
    В Swift это отличается. "ABC".characters возвращает тип String.CharacterView. Чтобы преобразовать его в массив, в частности типа [Character], вам нужно будет использовать инициализатор Array. – chrisamanse 1 October 2016 в 03:56
  • 5
    @chrisamanse О, я этого не знал. Я был неправ. Спасибо, что указали это. Кстати, я намеревался [String] вместо [Character], потому что op хотел массив строк :) – devxoul 1 October 2016 в 18:09

Вы также можете создать расширение:

var strArray = "Hello, playground".Letterize()

extension String {
    func Letterize() -> [String] {
        return map(self) { String($0) }
    }
}
1
ответ дан fabrizioM 21 August 2018 в 20:49
поделиться

Существует также эта полезная функция для String: components (separateBy: String)

let string = "1;2;3"
let array = string.components(separatedBy: ";")
print(array) // returns ["1", "2", "3"]

Хорошо работает для обработки строк, разделенных символом типа ";" или даже "\n"

5
ответ дан Frédéric Adda 21 August 2018 в 20:49
поделиться

В Swift 4, поскольку String является сборником Character, вам нужно использовать map

let array1 = Array("hello") // Array<Character>
let array2 = Array("hello").map({ "\($0)" }) // Array<String>
let array3 = "hello".map(String.init) // Array<String>
1
ответ дан onmyway133 21 August 2018 в 20:49
поделиться
func letterize() -> [Character] {
    return Array(self.characters)
}
1
ответ дан Piotr Pszczółkowski 21 August 2018 в 20:49
поделиться
  • 1
    Можете ли вы предоставить дополнительную информацию, почему это будет работать? :) – pix 27 October 2016 в 17:52
  • 2
    @pix Я думаю, он имел в виду, что это функция, определенная в расширении String. Я добавлю это к моему ответу. – ScottyBlades 20 September 2017 в 06:28

Обновлено для Swift 4

Вот три способа.

//array of Characters
let charArr1 = [Character](myString)

//array of String.element
let charArr2 = Array(myString)

for char in myString {
  //char is of type Character
}

В некоторых случаях то, что действительно хотят люди, это способ преобразования строки в массив маленьких строк с длиной 1 символ. Вот суперэффективный способ сделать это:

//array of String
var strArr = myString.map { String($0)}

Swift 3

Вот три способа.

let charArr1 = [Character](myString.characters)
let charArr2 = Array(myString.characters)
for char in myString.characters {
  //char is of type Character
}

В некоторых случаях то, что действительно хотят люди, это способ преобразования строки в массив небольших строк с длиной 1 символ. Вот суперэффективный способ сделать это:

var strArr = myString.characters.map { String($0)}

Или вы можете добавить расширение к String.

extension String {
   func letterize() -> [Character] {
     return Array(self.characters)
  }
}

Тогда вы можете вызвать его так:

let charArr = "Cat".letterize()
1
ответ дан ScottyBlades 21 August 2018 в 20:49
поделиться
    let string = "hell0"
    let ar = Array(string.characters)
    print(ar)
4
ответ дан William Hu 21 August 2018 в 20:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: