在单独的.swift文件中使用扩展名

寻找在独立文件或替代解决scheme中使用Swift扩展的方法。 只要扩展名被写入到正在使用的同一个文件中,创build扩展名就可以工作。

这是一个ViewController.swift工程的例子。

import UIKit var TestHelper: String = "Start Value" extension UIView { var testValue:String{ set{ TestHelper = newValue } get{ return TestHelper } } } class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() self.view.testValue = "Some Value" } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } } 

将这个扩展名从这个文件中取出并放入一个新的文件中会导致这个错误:

 Program ended with exit code: 9 

这个错误是说它不存在我想。 在每个单独的文件中创build扩展名所需的扩展名显然会造成无效重新声明的问题。

提前致谢!

如果将扩展名移到另一个文件,那么你也必须移动TestHelper。 或者简单的说:把TestHelper放到扩展中

我试过这个问题,认为这很容易,但似乎比我最初想象的更复杂。

我结束了UIView的子类。 我无法为添加了var的UIView创build扩展。 我想也许他们迫使我们inheritanceUIView,因为init或get / set是如何工作的。 我只是做了这个。 这是不一样的,但它具有相同的function

 import UIKit class MyView: UIView { var testValue: String? init(frame: CGRect) { super.init(frame: frame) self.backgroundColor = UIColor.greenColor() self.bringSubviewToFront(self.superview) } } 

然后就这样使用它

 override func viewDidLoad() { super.viewDidLoad() let myRect = self.myContent.frame let myNewView: MyView = MyView(frame: myRect) myNewView.testValue = "has been set" self.myView.addSubview(myNewView) NSLog("%@", myNewView.testValue!) } 

我可以用var来扩展Array

 extension Array { var last: T? { if self.isEmpty { NSLog("array crash error - please fix") return self [0] } else { return self[self.endIndex - 1] } } } 

如果仅添加函数而不是variables,则很容易为UIKit创build扩展

 extension UIView { func layerborders() { let layer = self.layer let frame = self.frame let myColor = self.backgroundColor layer.borderColor = UIColor.whiteColor().CGColor layer.borderWidth = 0.8 layer.cornerRadius = frame.width / MyConstants.CornerRadius.toRaw() } } 

我也遇到了同样的错误,并试图解决它我发现在扩展variables声明前添加静态似乎做的伎俩:

 import UIKit static var TestHelper: String = "Start Value" extension UIView { static var testValue: String { set { TestHelper = newValue } get{ return TestHelper } } } class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() self.view.testValue = "Some Value" } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } } 

希望能帮助到你!

“扩展不能添加存储的属性”(来自“Swift编程语言” )