致力于混合框架.在Obj-C文件中导入,但内部类不可见,只有公共类.
文档清楚地说明Swift和Obj-C之间应该有内部分支:
将Swift导入Objective-C
要在与Objective-C代码相同的框架目标中导入一组Swift文件,您不需要将任何内容导入到框架的伞形头中.相反,将您的Swift代码的Xcode生成的头文件导入到您想要使用Swift代码的任何Objective-C .m文件中.因为框架目标的生成标头是框架公共接口的一部分,所以只有标记为public修饰符的声明才会出现在框架目标的生成标头中.您仍然可以在框架的Objective-C部分中使用使用内部修饰符标记的Swift方法和属性,只要它们在从Objective-C类继承的类中声明即可.有关访问级别修饰符的更多信息,请参阅 Swift编程语言(Swift 2)中的访问控制.
代码示例(使用框架创建新项目)
// SwiftObject.swift
public class SwiftObject: NSObject {
public class func doSomething() {}
}
internal class YetAnotherSwiftObject: NSObject {
internal class func doSomething() {}
}
Run Code Online (Sandbox Code Playgroud)
// SomeObject.m file
@implementation SomeObject
- (void)someMethod {
[SwiftObject doSomething];
}
- (void)someOtherMethod {
[YetAnotherSwiftObject doSomething]; // Use of undeclared identifier
}
@end
Run Code Online (Sandbox Code Playgroud) 编辑
感谢@Airspeed Velocity找到了一个简单的解决方案,因为这是从JSON解析的.允许初始化程序采用AnyObject?并默认为Unknown(或Invalid):
init(value: AnyObject?) {
if let value = value as? Int
,let result = Result(rawValue: value) {
self = result
} else {
self = .Unknown
}
}
Run Code Online (Sandbox Code Playgroud)
//
原版的
我用一个Unknown案例实现了一个枚举:
enum Result: Int {
case Success
case Failure
case Foo
case Bar
case FooBar
case FooFoo
...
case Unknown = -1
}
Run Code Online (Sandbox Code Playgroud)
我想创建另一个初始化程序,它接受枚举无法识别的情况Int并返回Unknown:
init(value: Int) {
self.init(rawValue: value)
if self == nil { // Complication …Run Code Online (Sandbox Code Playgroud) 请考虑以下情形:
enum XYZ {
case X
case Y
case Z
}
let x = XYZ.X
switch x {
case .X, .Y where false:
println("x or y")
case .Z:
println("z")
default:
println("default")
break
}
Run Code Online (Sandbox Code Playgroud)
即使该where条款是false,该片段也会打印出来x or y.
没有发现任何提及它.任何人都知道如何重构这个而不重复第一种情况下的代码?
我fallthough现在使用但该where条款现在重复