簡體   English   中英

快速呼叫另一個班級的功能

[英]Call a func from another class in 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)
}

您需要一個DefaultsSet類的實例

在視圖控制器中,在類級別添加此行

var setOfDefaults = DefaultsSet()

然后閱讀

let loadeddata = setOfDefaults.read()

和寫

setOfDefaults.write(defaultCityName.text, switchState)

變量名稱setOfDefaults專門用於查看差異。

或將函數類的函數和變量設為靜態變量,然后在類上調用函數(不帶括號)

從您發布的代碼,看來你要么需要使write方法的類方法(只使用前綴class ),或者你需要調用它的一個實例DefaultsSetDefaultsSet().write(defaultCityName.text, switchState)

我發現的另一個問題是,您還需要解包textField的值。 您的write方法將StringBool作為參數,但是defaultCityName.text的值是可選的,因此String? 這會導致編譯器錯誤。

您可以嘗試如下操作:

@IBAction func saveSettings(sender: UIButton) {
    guard let text = defaultCityName.text else {
         // the text is empty - nothing to save
         return
    }

    DefaultsSet.write(text, switchState)
}

現在,該代碼應可以編譯,並讓您調用方法。

讓我知道這是否可以幫助您解決問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM