在从基于Obj-C的框架派生的Swift类中(但可以很容易地是具有@objc属性的Swift类),我声明了两个存储的属性:
var optInt: Int?
var optString: String?
Run Code Online (Sandbox Code Playgroud)
只有optString通过生成的-Swift.h头部暴露给Obj-C.
串?可能很好,因为它是使用NSString对象暴露的,它可以是nil,因此桥接有一种方法来表示没有价值.
如果我删除?从optInt它暴露出一个NSInteger类型,所以我可以看到,对于非可选整数,它避免了对象和桥接值类型到值类型,但这是否真的意味着一个Int?不能曝光?
我似乎无法找到明确说明这种情况的任何文档.这里有一个不兼容的Swift功能的完整列表,它们没有出现:使用Objective-C中的Swift
这里的用例是经典情况,需要传递一个合法地为零的数字ID.在Swift之前的世界中,NSNumber和nil正是我实现这一点的方式,但是尝试将类迁移到Swift然后在Swift类中专门用于Obj-C类型,这是错误的.
我想我曾设想过Int?不像Int会在背景中作为NSNumber桥接,其潜在的零值为Swift中的可选项提供"无值"元素.
这里有什么我想念的吗?重申一下,可以通过桥接将Swift Optional Int(Int?)暴露给Objective-C吗?
我发现构建一个混合的Swift/Obj-C iOS应用程序以避免在将类转换为Swift后出现构建错误非常具有挑战性.
这是与Swift文档中非常简短的段落有关的问题:
如果在Swift代码中使用自己的Objective-C类型,请确保在将Swift生成的头导入要从中访问Swift代码的Objective-C .m文件之前导入这些类型的Objective-C头.
首先,虽然文档相当明确有关导入-Swift.h文件到.m文件,有很多时候是从现在基于在斯威夫特代码类类型的引用.h对象-类的文件,所以我最终不得不进口-Swift.h中.h大部分的文件时间.与文档相矛盾似乎很奇怪,但我不知道这些标题会如何构建,到目前为止大部分时间都有效.
当生成的-Swift.h文件本身包含编译器错误时,会出现真正的问题
未知的类型名称'SomeObjCClass'
通过这些错误的唯一方法似乎是确保在-Swift.h文件之前达到所述类,正如文档所示,但无法弄清楚如何确定构建的顺序我发现自己导入各种Obj -C生成头之前的整个项目标题,直到我得到一个工作版本.这不是一个很好的方法来解决这个问题,但我不知道正确的方法.
我如何确定-Swift.h首次包含标题的位置,以便我可以获得在其上方导入的所有必需的Obj-C类,然后就-Swift.h可以根据需要在其余位置导入,或者它的先决条件的集合需要每次都包含在它上面(我想这与我现在正在做的事情不同)?
我正在使用Swift中的字典,它需要保存不同类型的值,尽管键几乎都是字符串.使用Objective-C这很容易,但Swift通常非常有用的类型安全性似乎使这更加困难.
我一直在使用[String:AnyObject]字典,直到我遇到无法将生成的AnyObject向下转换为Swift字符串,这在技术上不是对象而是值类型.我可以通过它来实现和平,因为它似乎有意义,虽然如果有一种解决方法(除了恢复到我不想做的NSString对象),我想知道它.
上面的逻辑解决方案似乎是切换到使用[String: Any]字典,但这样做,即使使用基本的代码,我也发现了一个问题:
func abc() {
var dict : [String: Any] = [String: Any]()
if dict["success"] != nil {
...
}
}
Run Code Online (Sandbox Code Playgroud)
上面的第3行代码给出了错误:
'String'不能转换为'DictionaryIndex <String,Any>'.
现在我好像有一个字典,其中包含我怀疑我可以根据需要转发的类型,但是它的密钥似乎不再可以访问,据我所知,它的类型恰好是正确的类型(实际上,虽然它是一个字面意思,甚至错误都表明我传递了一个字符串).我错过了什么,因为我实际上想要实现的是具有多种类型的易于访问的值的字典,我可以在var/let正确的Swift类型中实际检索?