gpt4 book ai didi

objective-c - OC转Swift过程中的Type Recognition Issue

转载 作者:行者123 更新时间:2023-11-28 07:05:49 25 4
gpt4 key购买 nike

我的情况:

我学习 Swift 有一段时间了,Swift 是我唯一学过的 iOS 开发语言,这意味着我没有系统地学习 Objective-C。我只能读一点 OC 代码。

当我尝试将 OC 项目转换为 Swift 项目时,我遇到了类型识别问题。

Objective-C 代码:

static inline NSRegularExpression * AccountRegularExpression() {
static NSRegularExpression *_accountRegularExpression = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_accountRegularExpression = [[NSRegularExpression alloc] initWithPattern:AccountRegular options:NSRegularExpressionCaseInsensitive error:nil];
});

return _accountRegularExpression;
}

我对那些神秘的代码感到困惑。

我的问题:

  • 目前我只是在swift和OC中遇到了两个不同的东西,几乎都是variable instancefunction,也就是说我可以读写代码初始化变量实例并创建函数。但是我从来没有在 OC 中看到过这样的东西(是的,我是初学者...),它看起来不像变量实例或方法。

  • 在这里问这个问题之前,我试着写了一个swift函数来充当原来的部分。问题是,编译器在我构建项目后没有抛出任何错误。

这是我的 Swift 代码:

func AccountRegularExpression() -> NSRegularExpression {
var accountRegularExpression: NSRegularExpression!
var onceToken: dispatch_once_t = 0
dispatch_once(&onceToken, {
accountRegularExpression = NSRegularExpression(pattern: self.AccountRegular, options: NSRegularExpressionOptions.CaseInsensitive, error: nil)
})
return accountRegularExpression
}
  • 我不知道这段 Swift 代码是否与那段 OC 代码具有相同的功能。

我的问题:

  • 你能告诉我OC代码是一个变量实例吗?我认为它不是函数或方法。

  • 我谷歌了一下关键词,inline,就是反编译的过程。这个过程在 Swift 中仍然有效吗?

  • 如何正确翻译 Swift 中的 OC 代码,我猜我的 swift 代码不正确。


非常感谢您的指导和时间。

伊桑·乔

最佳答案

翻译是错误的,因为变量 _accountRegularExpressiononceToken 在 C 中被声明为 static,这对于局部变量意味着它的状态被保持在函数调用之间,在程序的整个生命周期内,类似于全局变量。

它们是 static 对于此函数的正确运行至关重要,该函数返回一个单例实例。如果它们不是static,则:

  • dispatch_once 要求您给它一个指向“存储在全局或静态范围内”的 dispatch_once 的指针。通过给它一个具有自动存储的局部变量,您正在调用未定义的行为。不可能知道它会执行一次还是多次。
  • 如果_accountRegularExpression 不是static,则意味着此函数无法记住并返回它之前创建的同一实例。因此,它不是“单例”。如果 dispatch_once 只执行一次,则在第二次及后续时间此函数将返回 nil。如果dispatch_once执行了不止一次,那么每次再次执行都会返回一个新的独立实例。在任何情况下,它都不会返回之前已返回的实例。

要使其在 Swift 中正常运行,一种方法是使这些变量成为全局变量:

var accountRegularExpression: NSRegularExpression!
var onceToken: dispatch_once_t = 0
func AccountRegularExpression() -> NSRegularExpression {
dispatch_once(&onceToken, {
accountRegularExpression = NSRegularExpression(pattern: self.AccountRegular, options: NSRegularExpressionOptions.CaseInsensitive, error: nil)
})
return accountRegularExpression
}

但是,函数在 Swift 中返回单例的更好方法是:

func AccountRegularExpression() -> NSRegularExpression {
struct Singleton {
static let sharedInstance = NSRegularExpression(pattern: self.AccountRegular, options: NSRegularExpressionOptions.CaseInsensitive, error: nil)
}
return Singleton.sharedInstance
}

或者干脆去掉这个函数,让它成为一个计算属性:

var accountRegularExpression : NSRegularExpression {
struct Singleton {
static let sharedInstance = NSRegularExpression(pattern: self.AccountRegular, options: NSRegularExpressionOptions.CaseInsensitive, error: nil)
}
return Singleton.sharedInstance
}

或者如果这在某个类中有意义,那么就直接把它作为类的静态属性:

// inside some class
static let accountRegularExpression = NSRegularExpression(pattern: self.AccountRegular, options: NSRegularExpressionOptions.CaseInsensitive, error: nil)

关于objective-c - OC转Swift过程中的Type Recognition Issue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30659898/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com