【问题标题】:What's the difference between class methods and instance methods in Swift?Swift 中的类方法和实例方法有什么区别?
【发布时间】:2015-04-18 15:08:45
【问题描述】:
protocol NoteProtocol {
    var body: NSString? { get set }
    var createdAt: NSDate? { get set }
    var entityId: NSString? { get set }
    var modifiedAt: NSDate? { get set }
    var title: NSString? { get set }

    // class methods
    class func insertNewNoteInManagedObjectContext(managedObjectContext: NSManagedObjectContext!) -> NoteProtocol
    class func noteFromNoteEntity(noteEntity: NSManagedObject) -> NoteProtocol

    // instance methods
    func update(#title: String, body: String)
    func deleteInManagedObjectContext(managedObjectContext: NSManagedObjectContext!)
}

嗨 这是我在 GitHub 上找到的一段代码。在这个协议中,类方法和实例方法的主要区别是什么?它们是如何定义的? 谁能帮帮我?

【问题讨论】:

标签: swift oop methods protocols class-method


【解决方案1】:

来自the documentation的一些文字:

实例方法

实例方法是属于特定类、结构或枚举的实例的函数。它们支持这些实例的功能,方法是提供访问和修改实例属性的方法,或者提供与实例目的相关的功能。

即。类的实例必须调用此方法。示例:

var a:classAdoptingNoteProtocol=classAdoptingNoteProtocol()
a.update()

类方法

如上所述,实例方法是在特定类型的实例上调用的方法。您还可以定义在类型本身上调用的方法。这些类型的方法称为类型方法。您可以通过在方法的 func 关键字之前写关键字 class 来指示类的类型方法,通过在方法的 func 关键字之前写关键字 static 来指示结构和枚举的类型方法。

它们在其他语言中被称为静态方法。要使用它们,我会这样做:

var b=classAdoptingNoteProtocol.noteFromNoteEntity(...)

这将返回一个采用NoteProtocol 的类的实例。 IE。您不必创建该类的实例即可使用它们。

【讨论】:

  • "它们在其他语言中被称为静态方法。"不一样。类方法在运行时动态解析,而静态方法在编译时静态解析。
【解决方案2】:

下面定义实例方法和类方法(在 Swift 中称为类型方法)。

更多详情可以浏览method section of the Swift documentation

实例方法:

实例方法是属于特定类、结构或枚举的实例的函数。它们支持这些实例的功能,或者通过提供访问和修改实例属性的方法,或者通过提供与实例目的相关的功能。实例方法的语法与函数完全相同

类型方法:

如上所述,实例方法是被调用的方法 特定类型的实例。您还可以定义以下方法 调用类型本身。这几种方法称为类型 方法。您通过编写关键字来指示类的类型方法 class 在方法的 func 关键字之前,并为 结构和枚举通过在前面写关键字 static 方法的 func 关键字。

基本上你可以在没有实例的情况下调用类型方法(类方法):

var myNoteProtocol = NoteProtocolAdoptImplClass.noteFromNoteEntity(...);

虽然您需要实例化实例方法:

var myNoteProtocol  = NoteProtocolAdoptImplClass()
myNoteProtocol.update(...)

【讨论】:

  • "类方法(在Swift中称为类型方法)" 类型方法包括静态方法和类方法。它们是不同的东西。
猜你喜欢
  • 2010-11-06
  • 1970-01-01
  • 2015-04-17
  • 2012-10-21
  • 1970-01-01
  • 2013-06-12
  • 1970-01-01
  • 1970-01-01
  • 2013-03-24
相关资源
最近更新 更多