2015-07-03 4 views
1

Я пытаюсь написать свою первую программу Swift, и я знаю, что этот вопрос задан раньше, но ответы с использованием split не работают для меня. Я использую Xcode 6.4 и Swift 1.2.Разделить строку на массив в Swift

У меня есть строка с именем.

Если я пишу

let inputs = split(line) {$0 = " "} 

как было предложено на Swift: Split a String into an array, я получаю сообщение об ошибке "Невозможно вызвать 'раскол' со списком аргументов типа (String, () ->)"

Если я пишу

let inputs = split(line, {find(" ",$0) != nil}, allowEmptySlices: false) 

как было предложено на split now complains about missing "isSeparator", я получаю сообщение об ошибке «Отсутствует аргумент для параметра«я sSeparator 'в вызове.

Если я прыгну к определению раскола, я считаю

func split<S : Sliceable, R : BooleanType>(elements: S, maxSplit: Int = default, allowEmptySlices: Bool = default, #isSeparator: @noescape (S.Generator.Element) -> R) -> [S.SubSlice] 

Я не понимаю, что тип последнего параметра, который, возможно, корень моей проблемы. Можете ли вы рассказать мне, как я должен назвать раскол, и еще лучше вы можете объяснить, что такое тип параметра? Почему нет типа просто (S) -> R? Я получаю строку от генератора, который читает файл по строкам, если это имеет значение.

for line:String in reader! { 
let inputs = split(line) {$0 = " "} 
... 
} 
+0

'let input = split (line) {$ 0 ==" "}' – oisdk

+2

Сравнение выполняется с помощью '=='. '=' - оператор присваивания. –

+0

Трудно поверить, что я много раз искал код, но не замечал этого. Мне так глупо, спасибо. – saulspatz

ответ

2

Как сказано в комментариях к этому вопросу, правильный способ заключается в использовании оператора == вместо =.

Тип (S.Generator.Element) -> R) должны толковаться в свете определения split:

func split<S : Sliceable, R : BooleanType> 
    (elements: S, 
    maxSplit: Int = default, 
    allowEmptySlices: Bool = default, 
    #isSeparator: @noescape (S.Generator.Element) -> R) 
     -> [S.SubSlice] 

Тип split является общим один: другими словами, это функция, которая может принимать в качестве первого параметра любой значение, которое соответствует подтипу общего типа (или протокола) Sliceable, например String, и возвращает результат, который должен быть подтипом BooleanType (например, true или false, которые являются экземплярами Bool). Таким образом, последний параметр - это функция, которая получает в качестве параметра a тип, который равен Element из Generator из S (например, Character) и возвращает значение типа R. И {$0 == " "} - это точно предикат этого типа, который имеет (неявный) параметр ($0) и проверяет, равен ли он символу " ".

+0

Очень ясное объяснение, спасибо. Я думал о «генераторе» в смысле питона. Не могли бы вы указать мне, где я могу больше узнать о технических особенностях? – saulspatz

+0

На веб-сайте Apple есть много вводных [ресурсов] (https://developer.apple.com/swift/resources/), например видео в [Advanced Swift] (https://developer.apple.com/ видео/WWDC/2014 /? ID = 404). Однако усовершенствованная система Swift основана на типах технологий, которые были изучены в середине 80-х годов.Один из лучших технических документов, который читается с небольшим усилием, - это семантика [On Understanding Types, «Абстракция данных и полиморфизм»] (http://lucacardelli.name/Papers/OnUnderstanding.pdf) Л. Карделли и П. Вегнер. – Renzo

Смежные вопросы