将方法从 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` 和length
在NSString
中存在同样的问题,看来Apple 已经决定解决方案是不提供无法按预期工作的方法。 'length' 被 utf16count
和 countElements
替换,后者是一种迭代字符串的方法,用 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 时的区别
将json调用语法从Objective-C转换为Swift的正确方法是啥?