iOS Swift func,class func,@objc func的区别

问答iOS Swift func,class func,@objc func的区别
王利头 管理员 asked 6 月 ago
3 个回答
Mark Owen 管理员 answered 6 月 ago

在 iOS Swift 中,函数的类型有很多种,包括 func、class func 和 @objc func。了解它们之间的区别至关重要,以便在代码中做出正确的选择。下面,我将深入探讨它们的差异,并提供实用的示例。

func:实例方法

func 是最常见的函数类型,用于定义属于特定实例的方法。当调用 func 时,它可以访问实例的属性和方法。例如:

“`swift
class Person {
var name: String

func sayHello() {
    print("Hello, my name is \(name)")
}

}
“`

在上面的示例中,sayHello 是一个实例方法,因为它属于 Person 实例。当调用 sayHello 时,它可以访问实例的 name 属性。

class func:类方法

class func 是定义属于整个类而不是特定实例的方法。它用于执行与类本身相关的任务,例如创建新实例或访问类属性。例如:

swift
class Person {
class func create(name: String) -> Person {
return Person(name: name)
}
}

在上面的示例中,create 是一个类方法,因为它属于 Person 类。它用于使用提供的名称创建一个新的 Person 实例,而无需访问任何特定实例。

@objc func:Objective-C 兼容方法

@objc func 是一个特殊类型的函数,允许 Swift 代码与 Objective-C 代码交互。它使 Swift 方法可以被 Objective-C 对象调用。例如:

swift
@objc class Person: NSObject {
@objc func sayHello() {
print("Hello, my name is \(name)")
}
}

在上面的示例中,sayHello 是一个带 @objc 标记的实例方法。它允许 Objective-C 代码通过 performSelector 方法调用此方法。

什么时候使用哪种类型

以下是何时使用每种函数类型的指南:

  • func:使用实例方法来定义属于特定实例的逻辑。
  • class func:使用类方法来定义与整个类相关的逻辑,例如创建新实例或访问类属性。
  • @objc func:使用带有 @objc 标记的方法来允许 Swift 代码与 Objective-C 代码交互。

其他注意事项

  • class func 不能访问实例属性或方法,而 func 可以。
  • @objc func 只能在继承自 NSObject 的类中定义。
  • Swift 5.1 及更高版本中引入了 static func,它类似于 class func,但可以访问静态属性和方法。

总结

了解 func、class func 和 @objc func 之间の違い对于在 iOS Swift 代码中做出正确的选择至关重要。通过使用正确的函数类型,可以提高代码的组织性和可维护性。

seoer788 管理员 answered 6 月 ago

在 iOS Swift 开发中,我们经常使用 funcclass func@objc func 这三种方法声明。它们之间存在着细微差别,理解这些差别对于编写健壮且可维护的代码至关重要。

func

func 是我们在 Swift 中声明普通方法时使用的方法声明。它定义了一个实例方法,只能由对象实例调用。实例方法具有一个 self 参数,它引用调用该方法的对象实例。例如:

“`swift
class Person {
func greet() {
print(“Hello, my name is (name)”)
}
}

let person = Person(name: “John”)
person.greet() // 输出: Hello, my name is John
“`

class func

class func 用于声明类方法,它可以由类本身调用,而无需对象实例。类方法通常用于初始化类,提供实用程序功能,或访问静态属性。它们不具有 self 参数,因为它们不与特定的对象实例关联。例如:

“`swift
class Person {
class func create(name: String) -> Person {
return Person(name: name)
}
}

let person = Person.create(name: “Jane”) // 创建 Person 对象
“`

@objc func

@objc func 用于声明一个 Objective-C 兼容的方法。Objective-C 是 iOS 开发中一种较早的编程语言,Swift 与 Objective-C 代码可以互操作。通过使用 @objc 属性,我们可以将 Swift 方法公开给 Objective-C 代码。例如:

“`swift
@objc protocol MyProtocol {
@objc func doSomething()
}

class MyClass: MyProtocol {
@objc func doSomething() {
print(“Doing something”)
}
}

let myObject = MyClass()
myObject.doSomething() // 输出: Doing something
“`

总结

以下是这三种方法声明之间的关键区别:

| 特征 | func | class func | @objc func |
|—|—|—|—|
| 作用域 | 实例方法 | 类方法 | Objective-C 兼容 |
| 调用方式 | 通过对象实例 | 通过类本身 | 可以通过对象实例或 Objective-C 代码调用 |
| self 参数 | 有 | 无 | 无 |
| 用途 | 定义与对象实例关联的行为 | 提供类范围的功能 | 允许 Swift 方法与 Objective-C 代码交互 |

最佳实践

遵循以下最佳实践可以确保有效使用这些方法声明:

  • 对于与特定对象实例关联的行为,使用 func
  • 对于类范围的功能,使用 class func
  • 仅在需要与 Objective-C 代码交互时使用 @objc func
  • 避免过度使用 @objc func,因为它们会增加 Swift 代码的维护成本。
ismydata 管理员 answered 6 月 ago

在 iOS Swift 开发中,func、class func 和 @objc func 是用于定义方法的三种不同语法。它们在作用域、访问控制和 Objective-C 兼容性方面存在关键差异。

func

  • 普通方法,在结构体、类或枚举中定义。
  • 只能访问同一类型的实例变量和方法。
  • 仅在 Swift 代码中可见,不会公开给 Objective-C。

class func

  • 类方法,在类中定义,使用 static 关键字。
  • 可以访问类型的类变量和方法,但不能访问实例变量。
  • 可以在 Swift 和 Objective-C 代码中访问。

@objc func

  • 带有 @objc 属性的方法,明确将其公开给 Objective-C。
  • 可以访问 Swift 和 Objective-C 中的任何属性或方法。
  • 仅适用于类和扩展中定义的方法,不能用于结构体或枚举。

比较

| 特征 | func | class func | @objc func |
|—|—|—|—|
| 作用域 | 实例 | 类 | 实例或类 |
| 访问控制 | 实例变量/方法 | 类变量/方法 | 任何属性/方法 |
| Objective-C 可见性 | 否 | 是 | 是 |

具体用法

  • func:用于定义特定于实例的方法,例如计算实例属性或修改实例状态。
  • class func:用于定义与整个类型相关的操作,例如创建实例、验证输入或提供共享资源。
  • @objc func:用于在 Objective-C 和 Swift 代码之间创建桥梁,允许调用 Swift 方法或访问 Swift 属性。

实例

func

“`swift
struct Point {
var x: Int
var y: Int

func distanceToOrigin() -> Double {
    return sqrt(Double(x * x + y * y))
}

}
“`

class func

swift
class Circle {
static func create(radius: Double) -> Circle {
return Circle(radius: radius)
}
}

@objc func

“`swift
@objc class Shape {
@objc var color: UIColor

@objc func draw() {
    // Objective-C 代码可以调用此方法并访问 color 变量
}

}
“`

总结

func、class func 和 @objc func 在 iOS Swift 中提供不同的方法访问控制级别和 Objective-C 兼容性。理解它们的差异对于编写干净、可维护的代码非常重要。通过仔细选择正确的语法,可以优化应用程序性能,并增强可扩展性和可重用性。

公众号