2015-06-15 10 views
0

Как определить переменную типа unichar в Swift нравится '\0''\n' в Objective-C?Unichar variable в Swift

В Swift,

func previousCharacter() -> unichar { 
    return "\n"  //Error 
} 

Компилятор дал мне ошибку:

Cannot convert return expression of type 'String' to expected return type 'unichar'

Но в Objective-C, это будет более легко сделать это непосредственно.

+0

Вы делаете это точно так же ... Но с «знаками». Или, если вы имеете в виду unicode, вам это нравится: «\ u {24}« – Arbitur

+0

@Arbitur »« знаки будут распознаваться как String type –

+1

Использование *** Характер *** http://swiftdoc.org/type/Character/ –

ответ

2

В Swift литералы символов имеют тип Character.

let exclamationMark: Character = "!" 

См Strings and Characters

Для продвинутых читателей:

Вы также можете расширить unichar с возможностью принимать символьные литералы:

extension unichar : UnicodeScalarLiteralConvertible { 
    public typealias UnicodeScalarLiteralType = UnicodeScalar 

    public init(unicodeScalarLiteral scalar: UnicodeScalar) { 
     self.init(scalar.value) 
    } 
} 


let newLine: unichar = "\n" 
let whitespaces = NSCharacterSet.whitespaceAndNewlineCharacterSet() 

print("C is whitespace \(whitespaces.characterIsMember(newLine))") 

Однако, обратите внимание, что Swift литералы использовать 4 байта, в то время как unichar использует onl y 2 байта, поэтому некоторые символы будут усечены при преобразовании в unichar.

+0

Ударьте меня на это ... Я изначально пытался сделать расширение на unichar, что определило инициализатор удобства. Прочитав немного больше в теме: на самом деле это не требует Swift 2.0 и отлично работает с текущими версиями. unichar, который вы расширяете, не является протоколом, а структурой;) –

+0

Кроме того, вы можете напрямую использовать 'UnicodeScalar' как свой' UnicodeScalarLiteralType' и избавиться от let. Все, что он делает, это инициализировать 'UnicodeScalar' с помощью другого' UnicodeScalar'. Наконец, вам не нужно префикс типа значения с помощью 'unichar.' typealiases в любом случае, и даже если бы у вас было одно имя, объявленное на глобальном уровне, оно выбрало бы тот, который вы объявили в расширении. –

+0

@TimBodeit Спасибо, обновил код. У меня было много проблем с сбоем компилятора, поэтому мне потребовалось время для синтаксиса. – Sulthan

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

  • Нет связанных вопросов^_^