我正在尝试将传统的Objective-C函数转换为Swift并使用它运行到一些障碍中。这是Objective-C函数 -
UIImageView
我无法找到Swift等效内容的几行
- (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;
}
我是否可以使用Swift函数将String转换为UTF-8
const char *s = [cardNum UTF8String];
我如何代表角色&#39; 0&#39;在迅速。我可以使用&#39; - &#39;操作数呢?
任何指针都会受到赞赏。
答案 0 :(得分:4)
试试这个:
let s = cardNum.cStringUsingEncoding(NSUTF8StringEncoding)! // s is an Array<Int8>
...
let CHAR_ZERO : Int8 = 48
n = n * 10 + (s[j] - CHAR_ZERO);
将字符转换为Swift中ASCII表中的整数值很麻烦。所以你也可以把它定义为一个整数常量。
修改:如果您想要一种更安全的方式进行展开:
let s : Array<Int8>
if cardNum.canBeConvertedToEncoding(NSUTF8StringEncoding) {
s = cardNum.cStringUsingEncoding(NSUTF8StringEncoding)!
} else {
s = []
// Handle error
}
答案 1 :(得分: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
让我知道它是怎么回事。
答案 2 :(得分: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
}