Файл расширения импорта в Swift
Я создаю расширение для UIView в Swift. Кто-нибудь знает, как импортировать этот файл в мой 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
Ответы
Ответ 1
Здесь происходит несколько вещей.
- Нет необходимости импортировать расширения, как это необходимо для 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
.
-
Наконец, в компиляторе определенная ошибка, если у вашего расширенного вычисляемого свойства есть сеттер. Минимальный рабочий пример для воспроизведения ошибки, которая не включает рекурсию (путем исключения доступа к myVar) и просто игнорирует значение:
import UIKit
extension UIView {
var myVar : Float {
get {
return 0
}
set {
}
}
}
Ответ 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)")
}
}
Ответ 3
После выбора файла в Xcode в навигаторе проекта слева убедитесь, что вы проверяете приложение и проверяете его в разделе "Целевое членство" в представлении "Инспектор" справа.
Если он не установлен, он не будет включен в проект и, следовательно, вы получите ошибку компиляции.
![enter image description here]()
Ответ 4
Использование static перед объявлением свойства похоже на трюк.
extension UIView {
static var myVar : Float {
get {
return myVar
}
set (newMyVar) {
myVar = newMyVar
}
}
}
Надеюсь, что это поможет!