如果实现类被标记为私有,则不调用委托方法?

Joh*_*wak 7 delegates private ios swift

这里有一小段Swift代码可以正常工作(其中"精细"定义为"解析!",为响应调用类方法而打印了一大堆Parse.parse):

import Foundation

class Parse {
  class func parse(stream: NSInputStream) {
    return Parser().parse(stream)
  }

  class Parser: NSObject, NSXMLParserDelegate {
    func parse(stream: NSInputStream) {
      let XMLParser = NSXMLParser(stream: stream)
      let delegate = XMLParserDelegate()
      XMLParser.delegate = delegate
      XMLParser.parse()
    }

    class XMLParserDelegate: NSObject, NSXMLParserDelegate {
      func parser(
        parser: NSXMLParser,
        didStartElement elementName: String,
        namespaceURI: String?,
        qualifiedName qName: String?,
        attributes attributeDict: [NSObject : AnyObject])
      {
        NSLog("Parsing!")
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试使用Swift的可见性功能时会出现问题.特别是,我不想让Parser其他文件看到该类(因为它没有理由可见).如果我通过它声明它private class Parser …,代码停止工作!parser:didStartElement:namespaceURI:qualifiedName:attributes:不再叫!

这一切对我来说都很奇怪,而不像它在任何其他语言中如何运作.因此,我觉得以下两件事之一必须是真的:

  1. Swift的命名空间系统充其量是奇怪的.更明显的是,它似乎对我不利.

  2. 斯威夫特很好,我只是在做一些非常愚蠢的事情!如果是这样,那就太好了!请让我知道它是什么!

感谢大家的帮助!


编辑:这是一个略微修剪的版本.和以前一样,代码工作正常,直到Parser类标记为private:

import Foundation

class Parse {
  class func parse(stream: NSInputStream) {
    return Parser().parse(stream)
  }
}

class Parser: NSObject, NSXMLParserDelegate {
  func parse(stream: NSInputStream) {
    let XMLParser = NSXMLParser(stream: stream)
    XMLParser.delegate = self
    XMLParser.parse()
  }

  func parser(
    parser: NSXMLParser,
    didStartElement elementName: String,
    namespaceURI: String?,
    qualifiedName qName: String?,
    attributes attributeDict: [NSObject : AnyObject])
  {
    NSLog("Parsing!")
  }
}
Run Code Online (Sandbox Code Playgroud)

小智 0

根据MartinR 所做的调查,这似乎是 Swift 1.2 中引入的一个错误(或类似的错误)。据推测,这种行为不是故意的,因为我不知道任何其他(合理的、静态类型的)语言将类标记为私有可以在运行时默默地破坏您的代码。我会跟进苹果公司,看看他们对此有何看法!