【问题标题】:Proper way of returning array and checking if not nil返回数组并检查是否为 nil 的正确方法
【发布时间】:2017-01-10 07:45:33
【问题描述】:

我在学习 Swift 时遇到了问题。我有几个变量很好的类,但我想返回 [CGColor] 数组以在 UIView 中制作不同的背景渐变。

部分代码:

class Xxx{
    var _output : String!
    var _backgroundGradient : [CGColor]!

    //checking if not nil
    var output : String!{
        if _output == nil{
            _output = ""
        }
        return _output
    }

var backgroundGradient : [CGColor]{
    if _backgroundGradient?.isEmpty == false{
        print("There are objects!")
    } else{
        print("There are no objects")
        _backgroundGradient = [CGColor]()
    }
    return _backgroundGradient
}

所以你可以看到 _output 没问题,如果它是 nil,那么我分配空字符串。我试过用数组做类似的事情,如果它是空的,那么创建空数组但不是 nil

在代码中还有一个附加特定值的函数:

(...)
     self._backgroundGradient.append(UIColor(red:1.00, green:0.79, blue:0.04, alpha:1.00).cgColor)
     self._backgroundGradient.append(UIColor(red:0.97, green:0.41, blue:0.02, alpha:1.00).cgColor)
     print("GRADIENT inside func -> \(self._backgroundGradient)")
(...)

正如我在 Xcode 的底部控制台中看到的,它显示正确:

GRADIENT inside func -> Optional([<CGColor 0x6000000b1340> [<CGColorSpace 0x6000000359e0> (kCGColorSpaceICCBased; kCGColorSpaceModelRGB; sRGB IEC61966-2.1; extended range)] ( 1 0.79 0.04 1 ), <CGColor 0x6080000b15e0> [<CGColorSpace 0x6000000359e0> (kCGColorSpaceICCBased; kCGColorSpaceModelRGB; sRGB IEC61966-2.1; extended range)] ( 0.97 0.41 0.02 1 )])

当我尝试从 xxx 类分配 backgroundGradient 时,在 viewDidLoad() 的主 ViewController 文件中出现问题:

(...)
var classXxx : Xxx!

    override func viewDidLoad() {
        super.viewDidLoad()

        classXxx = Xxx()

        let gradient: CAGradientLayer = CAGradientLayer()

        gradient.colors = classXxx.backgroundGradient
        print("MainVC GRADIENT -> \(gradient.colors)")
(...)

和控制台的输出:

MainVC GRADIENT -> Optional([])

问题一定是在 var backgroundGradient 中返回。每个其他变量,如 string、int 等都像一个魅力,数组是一个问题。

【问题讨论】:

  • 当您执行Xxx() 时,您正在创建您的类的一个新实例,它自己的数组开始时为空。
  • @dan 所以 Xxx() 创建了空的 backgroundGradient 数组?但是我可以在不创建 classXxx = Xxx() 的情况下检索 backgroundGradient 吗?你能帮忙解决问题吗?

标签: ios arrays swift


【解决方案1】:

问题是您没有调用将颜色添加到 backgroundGradient 数组的函数。

您需要在创建 Xxx 对象后更改此代码 sn-p 以进行函数调用。

(...)
var classXxx : Xxx!

    override func viewDidLoad() {
        super.viewDidLoad()

        classXxx = Xxx()

        // Call function to add colors to the backgroundGradient array
        classXxx.addColors() // Change 'addColors()' to the name of the function which contains the lines of code quoted below

        let gradient: CAGradientLayer = CAGradientLayer()

        gradient.colors = classXxx.backgroundGradient
        print("MainVC GRADIENT -> \(gradient.colors)")
(...)

--

func addColors() {
    (...)
         self._backgroundGradient.append(UIColor(red:1.00, green:0.79, blue:0.04, alpha:1.00).cgColor)
         self._backgroundGradient.append(UIColor(red:0.97, green:0.41, blue:0.02, alpha:1.00).cgColor)
         print("GRADIENT inside func -> \(self._backgroundGradient)")
    (...)
}

--

编辑:

您可以通过使用默认值初始化变量来简化您的类。

例如:

class Xxx {
    var output : String = ""
    var backgroundGradient : [CGColor] = [
        UIColor(red:1.00, green:0.79, blue:0.04, alpha:1.00).cgColor,
        UIColor(red:0.97, green:0.41, blue:0.02, alpha:1.00).cgColor
    ]
}

【讨论】:

  • 天哪,这意味着我做错的唯一一件事就是在错误的地方调用了函数。它现在正在工作,但是否有更好的方法来做到这一点?感谢您的帮助!
  • 我不确定你到底想要什么。你想让 classXxx 总是以这两种颜色开始吗?
猜你喜欢
  • 1970-01-01
  • 2019-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-05
  • 1970-01-01
  • 2023-03-27
  • 2016-05-10
相关资源
最近更新 更多