将方法从Objective C转换为Swift

时间:2014-07-24 13:07:50

标签: objective-c swift

我开始学习Swift,并希望找到它作为Objective C的绝佳替代品。

我正在尝试将Objective C类转换为Swift,但我找不到将以下方法转换为Swift的最佳方法。

@implementation VersionReader

- (NSString *)readVersionFromString:(NSString *)string {
    if (string.length == 0) {
        return nil;
    }

    unichar firstChar = [string characterAtIndex:0];
    if (firstChar < '0' || firstChar > '9') {
        return nil;
    }

    NSUInteger length = string.length;
    for (NSUInteger i = 0; i < length; ++i) {
        if ([string characterAtIndex:i] == ' ') {
            return [string substringToIndex:i];
        }
    }

    return string;
}
@end

到目前为止,我的Swift代码如下所示:

import Cocoa

class VersionReader {
    func readVersionFromString(string: String) -> String? {
        if (string.isEmpty) {
            return nil
        }

        var firstChar = string.characterAtIndex[0]
        if (firstChar < 48 || firstChar > 57) {
            return nil
        }

        var length = string.utf16Count
        for (var i = 0; i < length; ++i) {
            if (string.characterAtIndex(i) == 32) {
                return string.substringToIndex(i)
            }
        }

        return string
    }
}

汤姆,我在两行上得到了同样的错误:

'String' does not have a member named 'characterAtIndex'

什么是在Swift中使这个工作的替代方案?提前谢谢。

3 个答案:

答案 0 :(得分:1)

可能的Swift解决方案:

func readVersionFromString(string: String) -> String? {
    if string.isEmpty {
        return nil
    }

    let firstChar = string[string.startIndex]
    if !find("0123456789", firstChar) {
        return nil
    } else if let pos = find(string, " ") {
        return string.substringToIndex(pos)
    } else {
        return string
    }
}

答案 1 :(得分:0)

Swift的String类型没有characterAtIndex方法。您可以将其投射到NSString并按如下所示使用它:

var firstChar = (string as NSString).characterAtIndex(0)

var firstChar = string.bridgeToObjectiveC().characterAtIndex(0)

请注意,characterAtIndex方法会返回unichar,这似乎就是您想要的。但获得Swift Character的正确方法将由FreeAsInBeer在他的回答中提出:Array(string)[0]

答案 2 :(得分:-1)

Swift没有characterAtIndex选择器。相反,您需要使用Array(string)[0]