【发布时间】:2017-07-19 01:22:14
【问题描述】:
我正在将我的 ObjC 代码转换为 Swift 并坚持使用此代码。
for (id<Delegate> object in Objects)
{
.......
......
}
任何帮助将不胜感激!
谢谢。
【问题讨论】:
标签: objective-c swift swift3
我正在将我的 ObjC 代码转换为 Swift 并坚持使用此代码。
for (id<Delegate> object in Objects)
{
.......
......
}
任何帮助将不胜感激!
谢谢。
【问题讨论】:
标签: objective-c swift swift3
你可以这样做
for object in Objects {
guard let delegateObject = object as? Delegate else {
continue
}
// rest of your loop here
}
【讨论】:
您的 Objective-C 语法表明您有一个名为 Objects 的集合,其对象符合名为 Delegate 的某种协议。 Swift 中的语法大体相同:
func callDelegateMethod(for objects: [Delegate]) {
for object in objects {
object.someDelegateMethod()
}
}
或者
func callDelegateMethod(for objects: [Delegate]) {
objects.forEach { object in
object.someDelegateMethod()
}
}
注意,在这些示例中,我扩展了示例以显示如何声明 objects(即作为符合 Delegate 协议的对象数组)。
如果您的 objects 数组更加模棱两可,在编译时无法确定与 Delegate 的一致性(例如,Any 的数组,或者您有什么),您可能需要投射它。例如,如果您知道objects 中的所有内容都符合Delegate,您可以这样做:
for object in objects as! [Delegate] {
object.someDelegateMethod()
}
但是,as! 可能很危险,因为如果其中任何一个施法失败,它就会崩溃。因此,如果有任何对象可能不符合要求,您可以选择强制转换,例如
for object in objects {
if let object = object as? Delegate {
object.someDelegateMethod()
}
}
或者,使用诸如compactMap(以前在Xcode 9.3 之前的版本中称为flatMap)和forEach 之类的函数式方法编写:
objects.flatMap { $0 as? Delegate } // use `compactMap` in Xcode 9.3 and later
.forEach { object in
object.someDelegateMethod()
}
【讨论】:
有两种可能的选择。
将您的代码粘贴到任何在线转换器中,例如Swiftify。
Edit-> Convert-> To modern swift code
然后您将获得几乎完全相同的 swift 2.2 或 3 代码。
【讨论】: