我正在创建一个快速框架。在那一个类是这样的,如下所示。
import Foundation
@objc public class classA: NSObject {
public override init (){
super.init();
}
/**
Singleton intance is returned.
*/
public class var sharedInstance: classA {
struct Static {
static let instance = popeye();
}
return Static.instance
}
}
现在,当我将此框架添加到Objective c项目并尝试访问“sharedInstance”时,我收到此错误。
在ClassA类型的对象上找不到属性“sharedInstance”。 修复它将'sharedInstance'替换为'sharedInstance'
但即使我尝试使用Fix it,这个问题也没有解决。
注意:当我将此框架与快速项目集成时,不会发生此问题!
我很生气.. :(
答案 0 :(得分:0)
我试图重现你的问题。起初,Xcode中的语法高亮显示标记了你提到的Objective-C中的相同错误,但代码实际上已构建并运行良好。
然而,有一种更清洁的方法。在您的代码中,您使用的是计算类型属性,每次访问它时都会对其进行评估!您可以通过介绍struct Static
来解决这个问题,您可以在classA
本身执行以下操作,如下所示:
/**
Singleton intance is returned.
*/
public static var sharedInstance: classA = popeye()
这里我们使用了一个存储的type属性,这是一种实现单例的推荐方法,请看这里: https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/AdoptingCocoaDesignPatterns.html 这里有一些关于不同类型属性的文档: https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Properties.html
答案 1 :(得分:0)
最后我能够通过一个小小的改变来解决这个问题! :)
Swift框架代码
@objc class SingletonTest:NSObject {
// swiftSharedInstance is not accessible from ObjC
class var swiftSharedInstance: SingletonTest {
struct Singleton {
static let instance = SingletonTest()
}
return Singleton.instance
}
// the sharedInstance class method can be reached from ObjC
class func sharedInstance() -> SingletonTest {
return SingletonTest.swiftSharedInstance
}
// Some testing
func testTheSingleton() -> String {
return "Hello World"
}
}
目标C父项目代码
SingletonTest * aTest = [SingletonTest sharedInstance]; NSLog(@“Singleton说:%@”,[aTest testTheSingleton]);