swift - "Extensions may not contain stored properties"除非你是苹果?我错过了什么?

标签 swift xcode swift4 xcode9

为什么 Apple 可以做到这一点:

import CoreGraphics
import GameplayKit
import simd

/**
 @header


 SceneKit framework category additions related to GameplayKit integration.


 @copyright 2017 Apple, Inc. All rights reserve.

 */

extension SCNNode {


    /**
     * The GKEntity associated with the node via a GKSCNNodeComponent.
     *
     * @see GKEntity
     */
    @available(OSX 10.13, *)
    weak open var entity: GKEntity?
}

/**
 * Adds conformance to GKSceneRootNodeType for usage as rootNode of GKScene 
 */
extension SCNScene : GKSceneRootNodeType {
}

...我不能这样做:

extension SCNNode {
    weak open var ntity: GKEntity?
}

得到两个错误:

  • “弱”只能应用于类和类绑定(bind)协议(protocol)类型,而不是“<<错误类型>>”
  • 扩展不能包含存储的属性

我实际上想做的是在 10.13 之前的 OSX 版本上提供实体属性,因此也欢迎对此提出其他建议。

最佳答案

swift 4/iOS 11/Xcode 9.2

这里的答案在技术上是正确的,但无论如何这里有一个解决方案。

在您的扩展中,定义一个包含您需要的字段的私有(private)结构。使所有内容静态化,如下所示:

private struct theAnswer {
    static var name: String = ""
}

我知道,我知道,static 意味着它是一个类范围的变量/属性,而不是一个实例。但我们实际上并不打算在此结构中存储任何内容。

在下面的代码中,obj_getAssociatedObjectobjc_setAssociatedObject 都需要一个UnsafeRawPointer 作为键。我们使用这些函数来存储与此唯一实例关联的键/值对。

这是带有字符串的完整示例:

import Foundation

class ExtensionPropertyExample {

    // whatever
}


extension ExtensionPropertyExample {
    private struct theAnswer {
        static var name: String = ""
    }

    var name: String {
        get {
            guard let theName = objc_getAssociatedObject(self, &theAnswer.name) as? String else {
                return ""
            }
            return theName
        }
        set {
            objc_setAssociatedObject(self, &theAnswer.name, newValue, .OBJC_ASSOCIATION_RETAIN)
        }
    }
}

关于swift - "Extensions may not contain stored properties"除非你是苹果?我错过了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44674549/

相关文章:

ios - 使用 Swift 3D 触摸力值改变声音的音量

xcode - 从WebView获取当前URL和标题

xcode - NSCollection View 背景色完全填充

ios - 无法识别的选择器发送到实例 - 仅限 Swift 4

swift - 将字典与数组合并为 Swift 4 中的值

ios - 来自 Calendar.dateComponents 的日期在 Swift 中返回 nil

ios - 如何在闭包中访问类的变量?

swift - 为什么 Parse 数据接口(interface)不接受我的结构数组?

swift - 使用保存在核心数据中的坐标在 map View 上绘制

ios - Xcode 9 更新 Swift,紫色警告