我在
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)") } }
这是编译器给出的错误:
命令/Applications/Xcode6-Beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift失败,退出代码为254
解决方法
这里有几件事情.
>不需要像Objective-C一样导入扩展,因为同一模块中的所有内容都可以在Swift中自动使用.这意味着您的扩展名实际上可以在视图控制器中对编译器成功显示.
>您只能将计算属性添加到扩展名.这意味着你实际上没有一个myVar来分配或读取.所以当你访问myVar时,你实际上是无限循环的.这实际上是警告所暗示的(尽管是模糊的):
warning: attempting to access 'myVar' within its own getter return myVar ^
>据我所知,无法使用扩展名将非计算属性添加到类型. Objective-C也是如此,实际存储使用类扩展添加到类的属性的唯一方法是通过objc_getAssociatedObject和objc_setAssociatedObject从objc / runtime.h使用Objective-C对象关联.
>最后如果扩展的计算属性有一个setter,那么编译器肯定会有一个错误.重现错误的最小工作示例,不包括递归(通过消除对myVar的访问),并忽略该值:
import UIKit extension UIView { var myVar : Float { get { return 0 } set { } } }