将方法从 Objective C 转换为 Swift

Posted

技术标签:

【中文标题】将方法从 Objective C 转换为 Swift【英文标题】:Converting a method from Objective C to Swift 【发布时间】:2014-07-24 13:07:49 【问题描述】:

我开始学习 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
    

Tom this,我在两行得到同样的错误:

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

在 Swift 中进行这项工作的替代方法是什么?提前致谢。

【问题讨论】:

***.com/questions/24092884/… IMO 苹果没有在 Swift 中提供 characterAtIndex 是有原因的。主要问题是角色是什么并不是一个容易回答的问题。对于初学者,有代理对和平面 1 字符,它们是两个 UTF-16 代码点。表情符号字符在平面 1 中。另请注意,出于同样的原因,没有 String.length 方法。 'characterAtIndex` 和lengthNSString 中存在同样的问题,看来Apple 已经决定解决方案是不提供无法按预期工作的方法。 'length' 被 utf16countcountElements 替换,后者是一种迭代字符串的方法,用 O(N) 时间计算字符数。 您期望什么输入字符串以及您想要生成什么输出?我倾向于相信整个方法可以改进。 【参考方案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
    

【讨论】:

【参考方案2】:

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]

【讨论】:

@NateCook 是的。你是对的。我从来没有说过它是。我不打算在这个答案中提供对 Swift 中字符串的全面处理。此外,问题的范围非常有限,我不认为编码是一个很大的问题。如果不是这种情况,OP 可以纠正我。【参考方案3】:

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

【讨论】:

(没有投票,但是)请注意,Array(string)[0] 返回一个Character,这与 48 或其他字符无法比较。 答案是否处理非 ASCII 字符?这真的是个好主意吗?它会继续工作吗?数组真的和字符串有相同的属性吗?它是否处理代理对?平面 1 unicode 字符(表情符号)? (不是反对票,但我同意反对票)

以上是关于将方法从 Objective C 转换为 Swift的主要内容,如果未能解决你的问题,请参考以下文章

从 Objective C 将回调/闭包转换为 Swift

如何将此方法从 Objective-C 转换为 Swift?

将方法从 Objective-C 转换为 Swift 时的区别

将json调用语法从Objective-C转换为Swift的正确方法是啥?

将 NSStrings 转换为 C 字符并从 Objective-C 调用 C 函数

将 Objective C“代码块”转换为 C++ 中的等价物