2015-09-29 1 views
1

Я пытаюсь преобразовать унаследованную функцию Objective-C в Swift и работать с некоторыми блокпостами с ней. Вот функция Objective-C -Преобразование строки Swift в UTF-8 и выполнение арифметики с использованием значения ASCII символа

- (SHCardType)cardType:(NSString *)cardNum { 
    if (cardNum.length <= 0) { 
     return SHCTUnknown; 
    } 
    const char *s = [cardNum UTF8String]; 

    if (sizeof(cardTypes[0]) == 0) { 
     return SHCTUnknown; 
    } 
    int cardsCount = sizeof(cardTypes)/sizeof(cardTypes[0]); 
    for (int i = 0; i < cardsCount; i++) { 
     int dig = log10(cardTypes[i].max) + 1; 
     int n = 0; 

     for (int j = 0; j < dig; j++) { 
      n = n * 10 + (s[j] - '0'); 
     } 

     if ((cardTypes[i].min <= n) && (n <= cardTypes[i].max)) { 
      SHCardType cardType = cardTypes[i].cardType; 
      int numLength = 16; 
      if (cardType == SHCTAmericanExpress) { 
       // Length is 15. Should confirm its type before all card number is entered. 
       return cardType; 
      } else if (cardType == SHCTDinersClubCarteBlanche || cardType == SHCTDinersClubenRoute || cardType == SHCTDinersClubInternational || cardType == SHCTDinersClubUnitedStatesCanada) { 
       numLength = 14; 
      } 

      // For DinersClubCarteBlanche card, the length may be 16. 
      if (numLength == cardNum.length || cardType == SHCTDinersClubCarteBlanche || cardType == SHCTDinersClubInternational) { 
       return cardType; 
      } 
     } 
    } 

    return SHCTUnknown; 
} 

Пару строк У меня возникают проблемы с поиском эквивалент Свифта как для

const char *s = [cardNum UTF8String]; 

Есть ли Swift функция я могу использовать, чтобы преобразовать строку в UTF -8

n = n * 10 + (s[j] - '0'); 

Как представить символ «0» в строке «Быстро». Могу ли я использовать операнд «-»?

Любые указатели будут оценены по достоинству.

+0

Вы пробовали автоматическое преобразование, предлагаемое в Xcode 7? –

+0

@AidanGomez Этот инструмент только преобразует Swift 1 в Swift 2, он не переводит Objective-C ... – Moritz

+0

также есть некоторые веб-инструменты (например, http://iswift.org/try), вопрос также в том, почему сделайте это на первом месте, так как вы легко можете вызвать код Objective-C из swift ... – PetrV

ответ

4

Попробуйте это:

let s = cardNum.cStringUsingEncoding(NSUTF8StringEncoding)! // s is an Array<Int8> 
... 
let CHAR_ZERO : Int8 = 48 
n = n * 10 + (s[j] - CHAR_ZERO); 

Это громоздко, чтобы преобразовать символ в целое значение в таблице ASCII в Swift. Таким образом, вы можете также определить его как целочисленную константу.

Edit: если вы хотите более безопасный способ сделать развёртки:

let s : Array<Int8> 
if cardNum.canBeConvertedToEncoding(NSUTF8StringEncoding) { 
    s = cardNum.cStringUsingEncoding(NSUTF8StringEncoding)! 
} else { 
    s = [] 
    // Handle error 
} 
+0

Для 'var val: Int8 = s [j]', я получаю сообщение об ошибке 'не может подстроить значение для ввода '[CChar]?' с индексом типа 'int'' – tbag

+0

Какую версию Swift вы используете? Возможно, вы забыли '!' В конце –

+0

Используя Swift 1.2 на данный момент. – tbag

1

От How can I get the Unicode code point(s) of a Character?

let ch: Character = "A" 
let s = String(ch).unicodeScalars 
s[s.startIndex].value // returns 65 

Так что, возможно попробовать:

let z = "0".unicodeScalars 
s[j] - z[z.startIndex].value 

Позвольте мне знать, как она идет.

+0

Эта работа, но ответ @Zoff Dino работал для меня – tbag

+0

@tbag только что протестирован, и это работает. –

1

Я не уверены, но вы можете попробовать это:

func cardType(cardNum: String) -> SHCardType { 
    if cardNum.length <= 0 { 
     return SHCTUnknown 
    } 
    let s: Character = cardNum.UTF8String() 
    if sizeof([0]) == 0 { 
     return SHCTUnknown 
    } 
    var cardsCount: Int = sizeof()/sizeof([0]) 
    for var i = 0; i < cardsCount; i++ { 
     var dig: Int = log10(cardTypes[i].max) + 1 
     var n: Int = 0 
     for var j = 0; j < dig; j++ { 
      n = n * 10 + (s[j] - "0") 
     } 
     if (cardTypes[i].min <= n) && (n <= cardTypes[i].max) { 
      var cardType: SHCardType = cardTypes[i].cardType 
      var numLength: Int = 16 
      if cardType == SHCTAmericanExpress { 
       return cardType 
      } 
      else { 
       if cardType == SHCTDinersClubCarteBlanche || cardType == SHCTDinersClubenRoute || cardType == SHCTDinersClubInternational || cardType == SHCTDinersClubUnitedStatesCanada { 
        numLength = 14 
       } 
      } 
      if numLength == cardNum.length || cardType == SHCTDinersClubCarteBlanche || cardType == SHCTDinersClubInternational { 
       return cardType 
      } 
     } 
    } 
    return SHCTUnknown 
} 
Смежные вопросы