在swift中从另一个类调用func

时间:2016-02-20 16:07:03

标签: swift

我想调用一个在另一个类上编码的函数 到目前为止,我已经在文件 structs.swift 上为我的数据创建了一个结构:

struct defValues {
    let defCityName: String
    let loadImages: Bool

    init(defCity: String, loadImgs: Bool){
        self.defCityName = defCity
        self.loadImages = loadImgs
    }

}

我已将 Defaults.swift 文件包含在内:

import Foundation

class DefaultsSet {

    let cityKey: String = "default_city"
    let loadKey: String = "load_imgs"

    func read() -> defValues {
        let defaults = NSUserDefaults.standardUserDefaults()
        if let name = defaults.stringForKey(cityKey){
            print(name)
            let valuesToReturn = defValues(defCity: name, loadImgs: true)
            return valuesToReturn
        }
        else {
            let valuesToReturn = defValues(defCity: "No default city set", loadImgs: true)
            return valuesToReturn
        }
    }

    func write(city: String, load: Bool){
        let def = NSUserDefaults.standardUserDefaults()
        def.setObject(city, forKey: cityKey)
        def.setBool(load, forKey: loadKey)
    }

}

其中我有两个函数读取,分别用NSUsersDefault写入读写数据 在我的主ViewController上,我可以用以下内容读取数据:

let loadeddata: defValues = DefaultsSet().read()
if loadeddata.defCityName == "No default city set" {
    defaultCity = "London"
}
else {
    defaultCity = loadeddata.defCityName
    defaultLoad = loadeddata.loadImages

}

但是当我尝试写数据时,它给了我错误。我使用这段代码:

@IBOutlet var settingsTable: UITableView!
@IBOutlet var defaultCityName: UITextField!
@IBOutlet var loadImgs: UISwitch!

var switchState: Bool = true

@IBAction func switchChanged(sender: UISwitch) {
    if sender.on{
        switchState = true
        print(switchState)
    }else   {
        switchState = false
        print(switchState)
    }
}

@IBAction func saveSettings(sender: UIButton) {
    DefaultsSet.write(defaultCityName.text, switchState)
}

2 个答案:

答案 0 :(得分:0)

您需要DefaultsSet

的实例

在视图控制器中,在类级别添加此行

var setOfDefaults = DefaultsSet()

然后阅读

let loadeddata = setOfDefaults.read()

并写

setOfDefaults.write(defaultCityName.text, switchState)

变量名setOfDefaults是为了看到差异。

或者使函数类函数和变量静态变量并调用类上的函数(不带括号)

答案 1 :(得分:0)

从您发布的代码中,您似乎需要将write方法设为类方法(只需在其前加class),或者需要在{{1}的实例上调用它}:DefaultsSet

我发现的另一个问题是你还需要解开textField的值。您的DefaultsSet().write(defaultCityName.text, switchState)方法将writeString作为参数,但Bool的值是可选的,因此defaultCityName.text。这会导致编译器错误。

您可以尝试这样的事情:

String?

此代码现在应该编译并让您调用您的方法。

让我知道它是否有助于您解决问题