2016-03-08 75 views
2

我有一个类,让它叫SomeClass。 SomeClass的实例有一个指向SomeOtherClass的可选指针。通过这种方式,给定一个指向SomeOtherClass(或SomeOtherClass的子类)的指针,可以实例化SomeClass的实例,然后可以使用该指针来动态创建属于SomeClass的这个SomeOtherClass的实例。例如;Swift类指针为?类协议?

class SomeClass { 
    var classPointer: SomeOtherClass.Type? 
} 

class SomeOtherClass { 
} 

到目前为止好。现在,我有一个协议 - 让我们称之为SomeProtocol - 我希望SomeOtherClass符合。该协议在它有一流的功能:

protocol SomeProtocol { 
    static func someClassFunction() 
} 

extension SomeOtherClass : SomeProtocol { 
    class func someClassFunction() { 
     print("I am a class function being executed on SomeOtherClass") 
    } 
} 

正如预期的那样,我就可以调用这个协议类功能上SomeOtherClass像这样:

SomeOtherClass.someClassFunction() // Prints "I am a class function being executed on SomeOtherClass" 

这里是麻烦的一部分。我想动态地确定SomeClass的classPointer实例是否符合SomeProtocol,如果是的话,执行它的类函数。所以,我尝试转换指针使用作为?:

// Create an instance of SomeClass and set it's classPointer to the SomeOtherClass class 
let someInstance = SomeClass() 
someInstance.classPointer = SomeOtherClass.self 

// Check if the instance's classPointer class conforms to the SomeProtocol protocol 
if let conformingClass = someInstance.classPointer as? SomeProtocol { 
    // If so, execute the class function in SomeProtocol on the instance's classPointer 
    conformingClass.someClassFunction() // Build fails "Static member someClassFunction cannot be used on instance of type SomeProtocol" 
} 

而构建失败,“someClassFunction的静态成员不能在类型SomeProtocol的情况下被使用”的错误。

有没有办法完成我正在尝试的?目前,如果这不起作用,我只能想到这些替代品(没有一个是可取的,而且都很朴素):

  1. 切换到目标c。
  2. 将协议切换为使用实例函数,然后实例化SomeClass的classPointer的临时实例并使用任何必要的函数将其发送消息,然后释放该实例。

为了完整起见,这里是所有的代码放在一起,可以粘贴到游乐场(它不会建立因错误我虽然提到过)的:

class SomeClass { 
    var classPointer: SomeOtherClass.Type? 
} 

class SomeOtherClass { 
} 

protocol SomeProtocol { 
    static func someClassFunction() 
} 

extension SomeOtherClass : SomeProtocol { 
    class func someClassFunction() { 
     print("I am a class function being executed on SomeOtherClass") 
    } 
} 

// Create an instance of SomeClass and set it's classPointer to the SomeOtherClass class 
let someInstance = SomeClass() 
someInstance.classPointer = SomeOtherClass.self 

// Check if the instance's classPointer class conforms to the SomeProtocol protocol 
if let conformingClass = someInstance.classPointer as? SomeProtocol { 
    // If so, execute the class function in SomeProtocol on the instance's classPointer 
    conformingClass.someClassFunction() // Build fails "Static member someClassFunction cannot be used on instance of type SomeProtocol" 
} 

感谢您的帮助您可以提供, - 亚当

回答

0

啊哈!像往常一样,只要我发布SO帖子,我就会找出答案。

对于那些想知道的,您必须将classPointer强制转换为协议的类型,而不是协议本身。行:

if let conformingClass = someInstance.classPointer as? SomeProtocol { 

需要改为:

if let conformingClass = someInstance.classPointer as? SomeProtocol.Type { 

然后你就可以留言conformingClass与SomeProtocol声明的类功能。完整的工作代码是:

class SomeClass { 
    var classPointer: SomeOtherClass.Type? 
} 

class SomeOtherClass { 
} 

protocol SomeProtocol { 
    static func someClassFunction() 
} 

extension SomeOtherClass : SomeProtocol { 
    class func someClassFunction() { 
     print("I am a class function being executed on SomeOtherClass") 
    } 
} 

// Create an instance of SomeClass and set it's classPointer to the SomeOtherClass class 
let someInstance = SomeClass() 
someInstance.classPointer = SomeOtherClass.self 

// Check if the instance's classPointer class conforms to the SomeProtocol protocol 
if let conformingClass = someInstance.classPointer as? SomeProtocol.Type { 
    // If so, execute the class function in SomeProtocol on the instance's classPointer 
    conformingClass.someClassFunction() 
} 

它工作:)。