"扩展程序可能不包含存储的属性"除非你是Apple?我错过了什么?

时间:2017-06-21 11:14:57

标签: 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?
}

并得到两个错误:

  • '弱'只能应用于类和类绑定协议类型,而不是'<<< error type>>'
  • 扩展程序可能不包含存储的属性

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

3 个答案:

答案 0 :(得分:3)

这在Swift中目前是不可能的。如Sulthan所述,这是一个Objective-C类别,您可以看到由Xcode生成的Swift版本。

现在,Objective-C不支持在类别中添加属性(扩展在Objective-C中称为类别),但您可以使用关联的对象来获得所需的内容。

Mattt Thompson在他的NSHipster博客上发表了一篇关于相关对象的精彩文章:Associated Objects - NSHipster

答案 1 :(得分:0)

有趣我和OP有同样的感觉。查看Apple自己的博文:https://developer.apple.com/swift/blog/?id=37

您会注意到它们明显违反了他们唯一的规则,并且他们解释了如何将JSON与不可编译的代码一起使用。

extension Restaurant {
    private let urlComponents: URLComponents // base URL components of the web service
    private let session: URLSession // shared session for interacting with the web service

    static func restaurants(matching query: String, completion: ([Restaurant]) -> Void) {
        var searchURLComponents = urlComponents
        searchURLComponents.path = "/search"
        searchURLComponents.queryItems = [URLQueryItem(name: "q", value: query)]
        let searchURL = searchURLComponents.url!

        session.dataTask(url: searchURL, completion: { (_, _, data, _)
            var restaurants: [Restaurant] = []

            if let data = data,
                let json = try? JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] {
                for case let result in json["results"] {
                    if let restaurant = Restaurant(json: result) {
                        restaurants.append(restaurant)
                    }
                }
            }

            completion(restaurants)
        }).resume()
    }
}

整篇文章是关于如何在Swift中处理JSON的,因此在任何Objective-C代码中都没有定义“Restaurants”。

答案 2 :(得分:0)

您可以尝试使用Xcode 8.3.3和Swift 3.1:

import SceneKit
import GameplayKit

extension SCNNode {

    @available(OSX 10.13, *)
    public var entity: GKEntity? {
        return self.entity
    }
}