Подтвердить что ты не робот

Файл расширения импорта в 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

4b9b3361

Ответ 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
        }
    }
}

Надеюсь, что это поможет!