我在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
这里有几件事情.
无需为Objective-C导入扩展,因为同一模块中的所有内容都可以在Swift中自动使用.这意味着您的扩展实际上对视图控制器中的编译器是成功可见的.
您只能将计算属性添加到扩展名.这意味着您实际上没有要分配或读取的myVar.因此,当您访问时,myVar
您实际上是无限递归.这实际上是警告暗示的内容(虽然模糊不清):
warning: attempting to access 'myVar' within its own getter return myVar ^
据我所知,没有办法使用扩展名向类型添加非计算属性.Objective-C也是如此,其中实际存储使用类扩展添加到类的属性的唯一方法是使用Objective-C对象通过objc_getAssociatedObject
和objc_setAssociatedObject
从objc/runtime.h
.
最后,如果您的扩展的计算属性具有setter,则编译器中肯定存在错误.重现错误的最小工作示例,不包括递归(通过消除对myVar的访问)并忽略该值是:
import UIKit extension UIView { var myVar : Float { get { return 0 } set { } } }