Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift类指针为?班级协议?_Ios_Swift_Class_Casting_Protocols - Fatal编程技术网

Ios Swift类指针为?班级协议?

Ios Swift类指针为?班级协议?,ios,swift,class,casting,protocols,Ios,Swift,Class,Casting,Protocols,我有一门课,我们叫它什么课吧。SomeClass的实例具有指向SomeOtherClass的可选指针。通过这种方式,可以实例化SomeClass的实例,给定指向SomeOtherClass(或SomeOtherClass的子类)的指针,然后可以使用该指针动态创建属于SomeClass的SomeOtherClass的实例。Eg class SomeClass { var classPointer: SomeOtherClass.Type? } class SomeOtherClass {

我有一门课,我们叫它什么课吧。SomeClass的实例具有指向SomeOtherClass的可选指针。通过这种方式,可以实例化SomeClass的实例,给定指向SomeOtherClass(或SomeOtherClass的子类)的指针,然后可以使用该指针动态创建属于SomeClass的SomeOtherClass的实例。Eg

class SomeClass {
    var classPointer: SomeOtherClass.Type?
}

class SomeOtherClass {
}
到目前为止还不错。现在,我有一个协议——我们称之为SomeProtocol——我希望其他类遵守它。此协议中包含类函数:

protocol SomeProtocol {
    static func someClassFunction()
}

extension SomeOtherClass : SomeProtocol {
    class func someClassFunction() {
        print("I am a class function being executed on SomeOtherClass")
    }
}
正如预期的那样,我可以在其他类上调用此协议类函数,如下所示:

SomeOtherClass.someClassFunction() // Prints "I am a class function being executed on SomeOtherClass"
这是麻烦的部分。我想动态地确定SomeClass类指针的实例是否符合SomeProtocol,如果符合,则对其执行class函数。因此,我尝试使用as?:

// 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类型的实例”

有没有办法完成我正在尝试的事情?目前,如果这不起作用,我只能想到这些替代方案(没有一个更可取,而且它们都相当粗糙):

  • 切换到目标c
  • 切换协议以使用实例函数,然后实例化SomeClass类指针的临时实例,并向其发送任何必要的函数,然后释放该实例
  • 为了完整起见,以下是所有可以粘贴到游乐场中的代码(由于我提到的错误,无法构建):

    谢谢你能提供的帮助,
    -亚当

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

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

    if let conformingClass = someInstance.classPointer as? SomeProtocol {
    
    需要更改为:

    if let conformingClass = someInstance.classPointer as? SomeProtocol.Type {
    
    然后,您将能够使用SomeProtocol中声明的类函数向conformingClass发送消息。完整的工作代码为:

    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()
    }
    
    它是有效的:)

    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()
    }