Ios 如何优化代码,使其在不同的类中使用一个方法而不是多个相同的方法?

Ios 如何优化代码,使其在不同的类中使用一个方法而不是多个相同的方法?,ios,objective-c,swift,optimization,Ios,Objective C,Swift,Optimization,我在不同的视图控制器类中有相同的方法,这基本上为视图控制器添加了模糊效果。现在我试图使用其他swift类型来简化我的代码,但我不知道如何实现这一点,以便添加子视图可以正常工作。处理此类案例的好方法是什么?扩展、协议、结构、类还是其他函数 这是一个视图控制器(此处简化): 我有其他类似的视图控制器。如何将它们重构为在整个项目中只使用一次addBlurEffect() 您可以使用子类化 创建一个属于UIViewController的子类的类,如下所示: class CustomViewControl

我在不同的视图控制器类中有相同的方法,这基本上为视图控制器添加了模糊效果。现在我试图使用其他swift类型来简化我的代码,但我不知道如何实现这一点,以便添加子视图可以正常工作。处理此类案例的好方法是什么?扩展、协议、结构、类还是其他函数

这是一个视图控制器(此处简化):


我有其他类似的视图控制器。如何将它们重构为在整个项目中只使用一次addBlurEffect()

您可以使用子类化

创建一个属于UIViewController的子类的类,如下所示:

class CustomViewController: UIViewController {

    weak var blurEffectView : UIVisualEffectView?

    func addBlurrEffect() {
        //layout for the pool of clnts that can be selected to add files
        let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.dark)
        let blurEffectVw = UIVisualEffectView(effect: blurEffect)
        blurEffectVw.frame = self.view.bounds
        blurEffectVw.autoresizingMask = [.flexibleWidth, .flexibleHeight]     // for supporting device rotation
        self.view.addSubview(blurEffectVw)
        blurEffectView = blurEffectVw

    }
}
然后,您可以将此类用于所有视图控制器,并访问
addBlurrEffect
函数,如下所示:

class ViewControllerOne: CustomViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        addBlurrEffect()

    }
}

class ViewControllerTwo: CustomViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        addBlurrEffect()

    }
} 

您可以使用子类化

创建一个属于UIViewController的子类的类,如下所示:

class CustomViewController: UIViewController {

    weak var blurEffectView : UIVisualEffectView?

    func addBlurrEffect() {
        //layout for the pool of clnts that can be selected to add files
        let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.dark)
        let blurEffectVw = UIVisualEffectView(effect: blurEffect)
        blurEffectVw.frame = self.view.bounds
        blurEffectVw.autoresizingMask = [.flexibleWidth, .flexibleHeight]     // for supporting device rotation
        self.view.addSubview(blurEffectVw)
        blurEffectView = blurEffectVw

    }
}
然后,您可以将此类用于所有视图控制器,并访问
addBlurrEffect
函数,如下所示:

class ViewControllerOne: CustomViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        addBlurrEffect()

    }
}

class ViewControllerTwo: CustomViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        addBlurrEffect()

    }
} 

在项目中为blur函数创建NSObject类,并在其中添加方法

要调用该方法,首先在VC中创建该模型类的对象,并像下面这样使用obj.addBlur()

注意:如果您需要vc中的任何变量,请将该变量作为addBlur函数的参数发送


示例:addBlur(self.Viewblur)

在项目中为blur函数创建NSObject类,并在其中添加方法

要调用该方法,首先在VC中创建该模型类的对象,并像下面这样使用obj.addBlur()

注意:如果您需要vc中的任何变量,请将该变量作为addBlur函数的参数发送


示例:addBlur(self.Viewblur)

在协议中声明此行为:

protocol Blurrable {
      var view: UIView { get set }
      var blurEffectView: UIVisualEffectView? { get set }

      func addBlurrEffect()
}
extension Blurrable {
      func addBlurrEffect()
        //layout for the pool of clnts that can be selected to add files
        let blurEffect = UIBlurEffect(style: .dark)
        blurEffectView = UIVisualEffectView(effect: blurEffect)
        blurEffectView.frame = self.view.bounds
        blurEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight]     // for supporting device rotation
        self.view.addSubview(blurEffectView)
    }
}
定义该协议扩展中的行为:

protocol Blurrable {
      var view: UIView { get set }
      var blurEffectView: UIVisualEffectView? { get set }

      func addBlurrEffect()
}
extension Blurrable {
      func addBlurrEffect()
        //layout for the pool of clnts that can be selected to add files
        let blurEffect = UIBlurEffect(style: .dark)
        blurEffectView = UIVisualEffectView(effect: blurEffect)
        blurEffectView.frame = self.view.bounds
        blurEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight]     // for supporting device rotation
        self.view.addSubview(blurEffectView)
    }
}
并将此协议的一致性添加到所有相关的ViewController:

class MyVC1: UIViewController, Blurrable {
    weak var blurEffectView : UIVisualEffectView?

    // ...
}

class MyVC2: UIViewController, Blurrable {
    weak var blurEffectView : UIVisualEffectView?

    // ...
}

在协议中声明此行为:

protocol Blurrable {
      var view: UIView { get set }
      var blurEffectView: UIVisualEffectView? { get set }

      func addBlurrEffect()
}
extension Blurrable {
      func addBlurrEffect()
        //layout for the pool of clnts that can be selected to add files
        let blurEffect = UIBlurEffect(style: .dark)
        blurEffectView = UIVisualEffectView(effect: blurEffect)
        blurEffectView.frame = self.view.bounds
        blurEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight]     // for supporting device rotation
        self.view.addSubview(blurEffectView)
    }
}
定义该协议扩展中的行为:

protocol Blurrable {
      var view: UIView { get set }
      var blurEffectView: UIVisualEffectView? { get set }

      func addBlurrEffect()
}
extension Blurrable {
      func addBlurrEffect()
        //layout for the pool of clnts that can be selected to add files
        let blurEffect = UIBlurEffect(style: .dark)
        blurEffectView = UIVisualEffectView(effect: blurEffect)
        blurEffectView.frame = self.view.bounds
        blurEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight]     // for supporting device rotation
        self.view.addSubview(blurEffectView)
    }
}
并将此协议的一致性添加到所有相关的ViewController:

class MyVC1: UIViewController, Blurrable {
    weak var blurEffectView : UIVisualEffectView?

    // ...
}

class MyVC2: UIViewController, Blurrable {
    weak var blurEffectView : UIVisualEffectView?

    // ...
}

像这样的东西会有用的。您也可以使用@IBenspectable

import UIKit

extension UIView {
  weak var blurEffectView : UIVisualEffectView?

  .... other methods .... 
         func addBlurrEffect() {
          //layout for the pool of clnts that can be selected to add files
          let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.dark)
          let blurEffectVw = UIVisualEffectView(effect: blurEffect)
          blurEffectVw.frame = self.view.bounds
          blurEffectVw.autoresizingMask = [.flexibleWidth, .flexibleHeight]     // for supporting device rotation
          self.view.addSubview(blurEffectVw)
          blurEffectView = blurEffectVw
      }
      ... other methods .... 
  } 
}

像这样的东西会有用的。您也可以使用@IBenspectable

import UIKit

extension UIView {
  weak var blurEffectView : UIVisualEffectView?

  .... other methods .... 
         func addBlurrEffect() {
          //layout for the pool of clnts that can be selected to add files
          let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.dark)
          let blurEffectVw = UIVisualEffectView(effect: blurEffect)
          blurEffectVw.frame = self.view.bounds
          blurEffectVw.autoresizingMask = [.flexibleWidth, .flexibleHeight]     // for supporting device rotation
          self.view.addSubview(blurEffectVw)
          blurEffectView = blurEffectVw
      }
      ... other methods .... 
  } 
}

您应该创建并向UIViewController添加扩展:

extension UIViewController {
    func addBlurrEffect() {
        //layout for the pool of clnts that can be selected to add files
        let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.dark)
        let blurEffectVw = UIVisualEffectView(effect: blurEffect)
        blurEffectVw.frame = self.view.bounds
        blurEffectVw.autoresizingMask = [.flexibleWidth, .flexibleHeight]     // for supporting device rotation
        self.view.addSubview(blurEffectVw)
        blurEffectView = blurEffectVw

    }
}

但是请注意,您不能在扩展中添加实例变量。您可能应该重构函数以返回生成的模糊效果视图,而不是依赖实例变量。

您应该创建一个扩展来添加UIViewController:

extension UIViewController {
    func addBlurrEffect() {
        //layout for the pool of clnts that can be selected to add files
        let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.dark)
        let blurEffectVw = UIVisualEffectView(effect: blurEffect)
        blurEffectVw.frame = self.view.bounds
        blurEffectVw.autoresizingMask = [.flexibleWidth, .flexibleHeight]     // for supporting device rotation
        self.view.addSubview(blurEffectVw)
        blurEffectView = blurEffectVw

    }
}

但是请注意,您不能在扩展中添加实例变量。您可能应该重构函数以返回结果模糊效果视图,而不是依赖实例变量。

您可以创建第二个类似这样的类

class BlurManager {
     weak var blurEffectView: UIVisualEffectView?
     weak var viewController: UIViewController
     var isBlurred:Bool = false

     init(viewController:UIViewController){
        self.viewController = viewController
     }

     func addBlurEffect() {
        if !isBlurred {
            isBlurred = true
            let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.dark)
            let blurEffectVw = UIVisualEffectView(effect: blurEffect)
            blurEffectVw.frame = self.view.bounds
            blurEffectVw.autoresizingMask = [.flexibleWidth, .flexibleHeight]     // for supporting device rotation
            viewController.view.addSubview(blurEffectVw)
            blurEffectView = blurEffectVw
        }
    }     

    func removeBlurEffect() {
       if isBlurred {
           isBlurred = false
           ...cleanup...
       }
    }
}

class MyClass: UIViewController { 
     lazy var blurManager: BlurManager = {
         return BlurManager(viewController:self)
     }()

     .... other methods .... 
    blueManager.addBlurEffect()
     ... other methods .... 
} 

你可以做这样的二等舱

class BlurManager {
     weak var blurEffectView: UIVisualEffectView?
     weak var viewController: UIViewController
     var isBlurred:Bool = false

     init(viewController:UIViewController){
        self.viewController = viewController
     }

     func addBlurEffect() {
        if !isBlurred {
            isBlurred = true
            let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.dark)
            let blurEffectVw = UIVisualEffectView(effect: blurEffect)
            blurEffectVw.frame = self.view.bounds
            blurEffectVw.autoresizingMask = [.flexibleWidth, .flexibleHeight]     // for supporting device rotation
            viewController.view.addSubview(blurEffectVw)
            blurEffectView = blurEffectVw
        }
    }     

    func removeBlurEffect() {
       if isBlurred {
           isBlurred = false
           ...cleanup...
       }
    }
}

class MyClass: UIViewController { 
     lazy var blurManager: BlurManager = {
         return BlurManager(viewController:self)
     }()

     .... other methods .... 
    blueManager.addBlurEffect()
     ... other methods .... 
} 


你试过分机吗?检查这个:@DharmeshKheni这是一个好主意,我想我必须把我的问题写得更笼统一点,因为我并不仅仅是在寻找这个案例的答案。这是一种更为普遍的方法,但非常感谢这一点,这有助于我们的欢迎:)@TheeBen为什么
UIVisualEffectView
很弱?@TheeBen没有
MyClass
拥有
blurEffectView
的所有权关系?您尝试过扩展吗?检查这个:@DharmeshKheni这是一个好主意,我想我必须把我的问题写得更笼统一点,因为我并不仅仅是在寻找这个案例的答案。这是一种更为普遍的方法,但非常感谢这一点,这有助于我们的欢迎:)@TheeBen为什么
UIVisualEffectView
?@TheeBen没有
MyClass
拥有
blurEffectView
的所有权关系?仅仅需要一个子类来获得这一方法是非常有限的。协议或扩展更合适。@Alexander,你说的限制是什么意思?如果你不介意扩大一点,那么限制是多少,谢谢lot@TheeBen如果我想将SomeOtherViewController子类化,但仍然使用模糊效果怎么办?让
SomeOtherViewController
成为
CustomViewController
@KennyGunderman的子类,你是对的,这会回答问题,但我认为这是我的错,我在寻找一种,对于一个一般性问题的更一般的答案,我试图将这个问题编辑成更一般的问题,需要一个子类来获得这个方法是非常有限的。协议或扩展更合适。@Alexander,你说的限制是什么意思?如果你不介意扩大一点,那么限制是多少,谢谢lot@TheeBen如果我想将SomeOtherViewController子类化,但仍然使用模糊效果怎么办?让
SomeOtherViewController
成为
CustomViewController
@KennyGunderman的子类,你是对的,这会回答问题,但我认为这是我的错,我在寻找一个更一般的问题的答案,我试图将这个问题编辑成更一般的问题,但是在addSubView()方面我会有困难吗然后?检查我现在添加的答案。考虑到扩展扩展扩展到所有UIViewController,编写协议只是需要添加更多代码,而不是简化,我发现这是做这件事的最简单的方法。但是当涉及addSubView()时,我会有困难吗然后?检查我现在添加的答案。考虑到扩展扩展扩展到所有UIViewController,编写协议只是需要添加更多代码,而不是简化。你不能像这样在UIView扩展中添加存储属性抱歉,我的代码有点不完整。您需要创建setter和getter。很好的调用@Alexander您不能像这样在UIView的扩展中添加存储属性抱歉,我的代码有点不完整。