在Swift中导入扩展文件

jav*_*gas 14 uiview ios swift

我在Swift中为UIView创建了一个扩展.任何人都知道如何将该文件导入我的UIViewController?

我想在控制器文件中导入扩展文件,这样我就可以重用扩展文件了.例如,像这样的结构:

UIViewExtension.swift

import UIKit

extension UIView {
    var myVar : Float {
        get {
            return myVar
        }
        set (newMyVar) {
            myVar = newMyVar
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

ViewController.swift

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        var squareView: UIView = UIView(frame: CGRect(x: 0, y: 0, width: 200, height: 200))

        squareView.myVar = 50

        self.view.addSubview(squareView)
        println("Offset: \(squareView.myVar)")
    }
}
Run Code Online (Sandbox Code Playgroud)

这是编译器给出的错误:

Command /Applications/Xcode6-Beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift failed with exit code 254

Nic*_* H. 8

这里有几件事情.

  1. 无需为Objective-C导入扩展,因为同一模块中的所有内容都可以在Swift中自动使用.这意味着您的扩展实际上对视图控制器中的编译器是成功可见的.
  2. 您只能将计算属性添加到扩展名.这意味着您实际上没有要分配或读取的myVar.因此,当您访问时,myVar您实际上是无限递归.这实际上是警告暗示的内容(虽然模糊不清):

    warning: attempting to access 'myVar' within its own getter
      return myVar
             ^
    
    Run Code Online (Sandbox Code Playgroud)
  3. 据我所知,没有办法使用扩展名向类型添加非计算属性.Objective-C也是如此,其中实际存储使用类扩展添加到类的属性的唯一方法是使用Objective-C对象通过objc_getAssociatedObjectobjc_setAssociatedObjectobjc/runtime.h.

  4. 最后,如果您的扩展的计算属性具有setter,则编译器中肯定存在错误.重现错误的最小工作示例,不包括递归(通过消除对myVar的访问)并忽略该值是:

    import UIKit
    
    extension UIView {
      var myVar : Float {
      get {
        return 0
      }
      set {
      }
      }
    }
    
    Run Code Online (Sandbox Code Playgroud)