Class 声明和用法

Class Declaration and Usage

新手问题。我只是想将 class(甚至结构)声明为单独的 Swift 文件,然后构建它或在单独的 class 中使用它。考虑一下:

import Foundation

class PayloadTest{
    var label: String
    init(label:String) {
          self.label = label
    }
}

---- 然后分开文件

import WatchKit
import Foundation


class InterfaceController2: WKInterfaceController {

    var payloadtest = PayloadTest(label: "test string init")

    payloadtest.label = "test" // this line gives error - says it was expecting a declaration
    .
    .
    .
}

我不明白为什么如果我在我的 watchOS 扩展中在同一级别创建 class 或结构,当我尝试访问变量时不允许访问或识别它。

你不能像这样在 class 中嵌套表达式。你可以通过将你的代码放在一个你立即调用的闭包中来解决这个问题:

class InterfaceController2: WKInterfaceController {

var payloadtest = {
    let pt = PayloadTest(label: "test string init")
    pt.label = "test"
    return pt
}()

正如评论部分中提到的 dfd 这是一个范围问题。在许多编程语言中,您不能编写既不是声明也不是初始化,也不是函数或方法外部的方法调用的语句(表达式)。

让我解释一下我说的,

在 class 或结构定义中,除声明和初始化之外的任何语句(表达式)都应出现在函数(方法)定义中。

class PayloadTest{
//The below statement is declaration, which declares label is an property of type string.
  var label: String
  init(label:String) {
//The below statement is an assignment, and it compiles and execute fine as this is inside a init method.
        self.label = label
  }
}

但是在你的第二个片段中,

导入 WatchKit 进口基金会

class InterfaceController2: WKInterfaceController {

//The below statement compiles fine even tough it isn't present inside a method coz it is initialization statement.

var payloadtest = PayloadTest(label: "test string init")

//However the compiler complains about the below assignment statement because, this is neither an declaration nor an initialization statement and it should not be outside method.
//So you've to keep this statement inside a method for compiler to stop complaining.

payloadtest.label = "test" // this line gives error - says it was expecting a declaration
....
}

要使第二个代码片段正常工作,请将下面的代码行放入一个方法中并调用该方法,

payloadtest.label = "test"

所以永远记住除了声明之外的任何语句,初始化应该出现在方法或函数定义中,这适用于大多数语言。

请查看当前的各个范围级别。 HTH:)

尝试下面的代码使用可选类型 -

class PayloadTest {
    var label: String?
    init(label:String) {
        self.label = label
    }
}

您可以尝试在函数中移动该代码。 (Swift 3.0 版本)

class InterfaceController: WKInterfaceController {

  var payloadtest = PayloadTest(label: "test string init")


  fileprivate func test() {
    payloadtest.label = "test" // tape this line in a function
  }


}