【问题标题】:@property/@synthesize equivalent in swiftswift 中的@property/@synthesize 等价物
【发布时间】:2014-07-23 18:24:48
【问题描述】:

我们曾经声明property在类之间传递数据如下:

.h file (interface file)
@property (nonatomic) double topSpeed;

.m file (implementation file)
@synthesize topSpeed;

现在没有interface类,.swift类之间如何传递数据?

【问题讨论】:

  • 你不解释,你说"We used to declare property to pass data between classes as following:"然后你的问题"Now there is no interface class, how to pass data between .swift classes ?"它在哪里解释?

标签: ios objective-c swift ios8


【解决方案1】:

使用属性。

来自Swift Programming Guide

存储的属性和实例变量

如果您有使用 Objective-C 的经验,您可能知道它提供了 将值和引用存储为类实例的一部分的两种方法。 除了属性之外,您还可以使用实例变量作为支持 存储存储在属性中的值。

Swift 将这些概念统一到一个属性声明中。一种 Swift 属性没有对应的实例变量,并且 不直接访问属性的后备存储。这 方法避免了在不同的情况下如何访问值的混淆 上下文并将属性的声明简化为一个单一的, 明确的声明。有关该物业的所有信息,包括其 名称、类型和内存管理特性——在一个 单个位置作为类型定义的一部分。

【讨论】:

    【解决方案2】:

    Swift 没有区分属性和实例变量(即属性的底层存储)。要定义属性,您只需在类的上下文中声明一个变量。

    一个 swift 类只是一个 ClassName.swift 文件。

    你声明一个类和属性为

    class SomeClass {
    
      var topSpeed: Double
      var aStrProperty: String
      var anIntProperty: Int
    
      //Initializers and other functions
    
    }
    

    您可以通过点符号访问属性值。从 Xcode6 beta 4 开始,Swift 中还有访问修饰符(publicinternalprivate)。默认情况下,每个属性都是internalSee here 了解更多信息。

    更多信息,请参考Swift Programming Guide

    存储的属性和实例变量

    如果您有使用 Objective-C 的经验,您可能知道它提供了 将值和引用存储为类实例的一部分的两种方法。 除了属性之外,您还可以使用实例变量作为支持 存储存储在属性中的值。

    Swift 将这些概念统一到一个属性声明中。一种 Swift 属性没有对应的实例变量,并且 不直接访问属性的后备存储。这 方法避免了在不同的情况下如何访问值的混淆 上下文并将属性的声明简化为一个单一的, 明确的声明。有关该物业的所有信息,包括其 名称、类型和内存管理特性——在一个 单个位置作为类型定义的一部分。

    【讨论】:

    • 谢谢!我正在尝试以这种表示法执行此操作,但在类声明行中不断收到 Class 'MyClass' has no initializers 错误消息。
    • @RubenMartinezJr。您需要为每个属性提供初始值设定项或默认值。上面的代码只是为了说明属性声明。
    • 可以覆盖他们的 getter/setter 吗?例如,Obj-C @property (readwrite) Type *name 带有一个 name getter 和一个 setName setter,可以用 Type *newVar = holder.name;holder.name = newVar;Type *newVar = [holder name];[holder setName: newVar]; 调用。这意味着如果我想为这些添加特殊行为,我必须做的就是创建一个- (Type) name 和或- (void) setName: (Type *)newName;。 (另请参阅 stackoverflow.com/questions/6843125/custom-setter-for-property有 Swift 等价物吗?
    • 我认为这可能是错误的,因为我们使用@synthesize 重命名变量,如果我们希望更改访问级别,Objective-c 中还有其他方法,那么我们可以通过其他方式进行操作
    【解决方案3】:

    听起来您的问题至少有一部分与将给定类的接口与其他类通信有关。与 Java 一样(与 C、C++ 和 Objective-C 不同),Swift 不会将接口与实现分开。如果您想使用在其他地方定义的符号,则不要import 头文件。相反,你import一个模块,比如:

    import Foundation
    import MyClass
    

    要访问另一个类中的属性,请导入该类。

    【讨论】:

    • 如果你有 MySimpleViewController.swift 这样的类,你不需要添加import MySimpleViewController。 Xcode 应该会自动选择你的类定义。对于 Xcode6 beta (6A215l),您可能会遇到一条错误消息,指出在另一个类定义中使用 MySimpleViewController 类型时未声明它。请务必清理并重建您的项目:SHIFT+CMD+K 和 CMD+B
    【解决方案4】:

    Objective-C 中的属性对应于 Swift 中的属性。在 Objective-C 和 Swift 中实现属性有两种方式:

    1. Objective C 中的合成/自动合成属性——这些在 Swift 中称为“存储属性”。您只需在类声明中使用var topSpeed : Doublelet topSpeed : Double = 4.2 声明它,就像在函数体中声明局部变量一样。您不必指定支持实例变量的名称,因为目前 Swift 中没有实例变量。您必须始终使用属性而不是其支持实例变量。
    2. 在 Objective-C 中手动实现的属性——这些在 Swift 中被称为“计算属性”。您可以在类声明中声明它们,例如var topSpeed : Double { get { getter code here } set { setter code here } }(用于readwrite 属性)或var topSpeed : Double { getter code here }(用于readonly 属性)。

    【讨论】:

      【解决方案5】:

      存储的属性和实例变量

      如果您有使用 Objective-C 的经验,您可能知道它提供了两种方法来将值和引用存储为类实例的一部分。除了属性之外,您还可以使用实例变量作为存储在属性中的值的后备存储。

      Swift 将这些概念统一到一个属性声明中。 Swift 属性没有对应的实例变量,并且不会直接访问属性的后备存储。这种方法避免了在不同上下文中如何访问值的混淆,并将属性的声明简化为一个单一的、明确的声明。有关属性的所有信息(包括其名称、类型和内存管理特性)都在一个位置定义为类型定义的一部分。

      来自 Swift Programming Book:

          struct FixedLengthRange {
          var firstValue: Int
          let length: Int
          }
      
          var rangeOfThreeItems = FixedLengthRange(firstValue: 0, length: 3)
      

      【讨论】:

        【解决方案6】:

        我说:typealias@synthesize 的 swift 等效

        看看这个链接:https://docs.swift.org/swift-book/ReferenceManual/Declarations.html

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-31
          • 2014-11-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多