В Swift 2 функция split
верхнего уровня теперь является методом в CollectionType
(которому соответствует каждое из «114 представлений символов» String
). Есть две версии метода, вы хотите, чтобы тот, который принимает замыкание в качестве предиката, указывает, должен ли данный элемент рассматриваться как разделитель.
Вы можете получить набор символов из строки в виде набора символов UTF16, используя string.utf16
, что делает их совместимыми с API NSCharacterSet
. Таким образом, мы можем легко проверить внутри замыкания, является ли данный символ в строке членом набора символов новой строки.
Стоит отметить, что split(_:)
вернет SubSequence
символов (в основном, Slice
), поэтому его необходимо преобразовать обратно в массив строк, что, как правило, более полезно. Я сделал это ниже, используя flatMap(String.init)
- инициализатор UTF16View
в String
не работает, поэтому использование flatMap
будет игнорировать любые значения nil
, которые могут быть возвращены, гарантируя, что вы получите массив необязательных строк назад.
Итак, для хорошего Swift-подобного способа сделать это:
let str = "Line 1\nLine 2\r\nLine 3\n"
let newlineChars = NSCharacterSet.newlineCharacterSet()
let lines = str.utf16.split { newlineChars.characterIsMember([110]) }.flatMap(String.init)
// lines = ["Line 1", "Line 2", "Line 3"]
Что делает это приятным, так это то, что метод split
имеет параметр allowEmptySubsequences
, который гарантирует, что вы не получите никакого пустые последовательности символов в результате. По умолчанию это false
, так что вам вообще не нужно его указывать.
Если вы хотите вообще избежать NSCharacterSet
, вы можете так же легко разделить коллекцию юникод-совместимых Character
сек.
let lines = str.characters.split { [111] == "\n" || [111] == "\r\n" }.map(String.init)
Свифт может рассматривать "\r\n"
как один расширенный кластер графем, используя его как один Character
для сравнения вместо создания String
. Также обратите внимание, что инициализатор для создания строки из Character
не является неисправным, поэтому мы можем просто использовать map
.
Это можно сделать несколькими способами. Если вы посмотрите на Список приоритетов в MSDN
то вы можете видеть, что передний план, установленный способами 1-8, переопределит передний план
из стиля по умолчанию. Самый простой способ - просто установить локальное значение в TextBox
.
<TextBox Foreground="Red" />
Еще вы можете использовать свойство стилей 'BasedOn'
, чтобы переопределить другие версии. Для этого требуется указать значение ключа для вашего стиля по умолчанию, но затем его можно использовать для применения значения по умолчанию, как в этом примере:
<Style TargetType="{x:Type TextBox}"
x:Key="myTextBoxStyle">
<Setter Property="Foreground"
Value="Red" />
<Setter Property="FontWeight"
Value="Bold" />
</Style>
<!-- Style applies to all TextBoxes -->
<Style TargetType="{x:Type TextBox}"
BasedOn="{StaticResource myTextBoxStyle}" />
<TextBox Text="Hello">
<TextBox.Style>
<Style BasedOn="{StaticResource myTextBoxStyle}" TargetType="{x:Type TextBox}">
<Setter Property="Foreground"
Value="Blue" />
</Style>
</TextBox.Style>
</TextBox>
Изменить:
В случае, если стиль по умолчанию применяет значение, и вы хотите Чтобы вернуть его к базовому значению, я могу придумать несколько способов получить такое поведение. Насколько мне известно, вы не можете выполнить привязку к стандартному значению темы обычным образом.
Однако мы можем сделать некоторые другие вещи. Если нам нужен стиль, чтобы не применять некоторые свойства, мы можем установить стиль на {x: Null}
, таким образом останавливая применение стиля по умолчанию. Или мы можем дать элементу собственный стиль, который не наследуется от базового стиля, а затем повторно применить только те сеттеры, которые нам нужны:
<TextBox Text="Hello" Style="{x:Null}" />
<TextBox Text="Hello">
<TextBox.Style>
<Style TargetType="{x:Type TextBox}">
<Setter Property="FontWeight"
Value="Bold" />
</Style>
</TextBox.Style>
</TextBox>
Мы могли бы изменить стиль по умолчанию так, чтобы передний план устанавливался только при определенных условиях, например, тег является определенным значением.
<Style TargetType="{x:Type TextBox}"
x:Key="myTextBoxStyle">
<Setter Property="FontWeight"
Value="Bold" />
<Style.Triggers>
<Trigger Property="Tag"
Value="ApplyForeground">
<Setter Property="Foreground"
Value="Red" />
</Trigger>
</Style.Triggers>
</Style>
<TextBox Text="Hello" />
<TextBox Text="Hello" Tag="ApplyForeground" />