在Swift中导入扩展文件

 qin2112 发布于 2023-01-11 19:42

我在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

1 个回答
  • 这里有几件事情.

      无需为Objective-C导入扩展,因为同一模块中的所有内容都可以在Swift中自动使用.这意味着您的扩展实际上对视图控制器中的编译器是成功可见的.

      您只能将计算属性添加到扩展名.这意味着您实际上没有要分配或读取的myVar.因此,当您访问时,myVar您实际上是无限递归.这实际上是警告暗示的内容(虽然模糊不清):

      warning: attempting to access 'myVar' within its own getter
        return myVar
               ^
      

      据我所知,没有办法使用扩展名向类型添加非计算属性.Objective-C也是如此,其中实际存储使用类扩展添加到类的属性的唯一方法是使用Objective-C对象通过objc_getAssociatedObjectobjc_setAssociatedObjectobjc/runtime.h.

      最后,如果您的扩展的计算属性具有setter,则编译器中肯定存在错误.重现错误的最小工作示例,不包括递归(通过消除对myVar的访问)并忽略该值是:

      import UIKit
      
      extension UIView {
        var myVar : Float {
        get {
          return 0
        }
        set {
        }
        }
      }
      

    2023-01-11 19:46 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有