在Swift中导入扩展文件

时间:2014-06-03 17:22:12

标签: ios uiview swift

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

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

UIViewExtension.swift

import UIKit

extension UIView {
    var myVar : Float {
        get {
            return myVar
        }
        set (newMyVar) {
            myVar = newMyVar
        }
    }
}

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)")
    }
}

这是编译器给出的错误:

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

4 个答案:

答案 0 :(得分:8)

这里有几件事。

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

    warning: attempting to access 'myVar' within its own getter
      return myVar
             ^
    
  3. 据我所知,无法使用扩展名为类型添加非计算属性。 Objective-C也是如此,其中实际存储使用类扩展添加到类的属性的唯一方法是通过objc_getAssociatedObject和来自objc_setAssociatedObject的{​​{1}}使用Objective-C对象关联}。

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

    objc/runtime.h

答案 1 :(得分:2)

我也遇到过这个问题。它似乎是一个编译器错误。如果您在独立扩展文件中计算了属性,编译器似乎会崩溃。我找到的解决方法是在非独立文件中创建扩展。因此,在这种情况下,您可以将扩展名移动到ViewController.swift文件中。像这样:

import UIKit

extension UIView {
    var myVar : Float {
        get {
            return myVar
        }
        set (newMyVar) {
            myVar = newMyVar
        }
    }
}

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)")
    }
}

答案 2 :(得分:0)

在左侧的Project导航器中选择Xcode中的文件后,请确保检查应用程序并在右侧的Inspector视图的Target Membership部分中进行测试。

如果没有检查,那么它将不会包含在项目中,因此您将收到编译错误。

enter image description here

答案 3 :(得分:-1)

在属性声明前使用 static 似乎可以解决问题。

extension UIView {
    static var myVar : Float {
        get {
            return myVar
        }
        set (newMyVar) {
            myVar = newMyVar
        }
    }
}

希望它有所帮助!