swift - 从一个类调用另一个类的函数,Xcode 错误

标签 swift

我有一个 View Controller 和两个类。 ClassOne 和 ClassTwo 都有对 View Controller 的引用,如下所示:

var viewController: ViewController?

View Controller 和 ClassTwo 都有一个我这样分配的 ClassOne 变量,以便检索其他变量和调用函数。

let class_one = ClassOne()

ClassOne 中,我试图在 ClassTwo 中调用一个函数,该函数使用 class_one 来调用 ClassOne 中的函数。例如,在 ClassTwo 中:

func changeString() {
    self.class_one.string = "yada yada"
}

以下是我尝试在 ClassOne 中调用 changeString() 的不同方法:

// Method one:
ClassTwo().changeString()

// Method two:
let class_two = ClassTwo()
self.class_two.changeString()

// Method three:
var class_two: ClassTwo?
self.class_two!.changeString()

当我使用方法一运行应用程序时,应用程序崩溃并显示 ClassTwo 中的 viewController 和 classOne 引用为零。

当我使用方法二运行应用程序时,它崩溃了,Xcode 给了我以下内存警告,引用 ClassOne 中的 changeString() 函数调用之间的来回错误> 和我在 ClassTwo 中调用的 self.class_one.string 变量。

Xcode memory warning - could not load any Objective-C class information

这不是我的实际代码,但这是我面临的问题。我是 Swift 的初学者,我真的不明白 ClassOne 中所有这三个 ClassTwo 函数调用有什么区别。

谁能解释一下我做错了什么?

最佳答案

老实说,根据您提供的信息无法确定崩溃的原因。您必须发布您的实际代码,比此处提供的更详细。

虽然这是一个答案,但因为您的场景设计不佳。听起来您会从代码的划分中受益。

Example

如果你有一个负责跟踪用户位置的类,你可以像这样在你的 View Controller 中实例化它:

让 locationTracker = LocationTracker()

然后假设您需要将位置值解析为字符串,您可能有另一个负责此操作的类:

让 locationParser = LocationParser()

这里 locationParserlocationTracker 没有理由相互引用 View Controller 例如

let location = locationTracker.currentLocation()
let locationAsString = locationParser.parseLocation(location)

Global functions

我犹豫要不要添加这个,因为它会导致无法维护和困惑的代码,但在 swift 中,您可以在类之外定义一个函数。类中的函数通常称为方法。当它们在类之外时,它们被称为函数。

所以你可以有一个名为 Functions.swift 的 swift 文件并简单地定义:

func globalFunc() {

    print("Hello, World!")
}

可以从代码中的任何位置调用此函数。

Code Design

如果您想创建可维护且本质上高质量的软件,您构建和设计代码的方式非常重要。

阅读不同的架构和工具有助于您组织项目,您会受益匪浅。喜欢:

MVC

MVVM

Reactive X

Dependency Injection

MVC 是 Apple 的方式,但您可以从其他方法的知识中获益。另请注意,依赖项注入(inject)文章提供了 Objective-C 代码示例。我知道您正在学习 Swift,但如果可以的话,最好了解 Objective-C 的应用知识。 Apple 的框架仍然全部用 Objective-C 编写。

关于swift - 从一个类调用另一个类的函数,Xcode 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36680357/

相关文章:

ios - 快速滑动 View

ios - 在 Swift 中优化屏幕反馈绘制立方贝塞尔曲线

ios - 我们如何使用 swift 和 iOS 11+ 进行直线图像转换

ios - 将手势识别器添加到由 PaintCode 创建的 BezierPath

swift - 错误无法调用类型 'Box<T>' 的初始化程序

swift - 匹配 "com.project.name"但不包含其他内容

ios: 具有 Aspect Fill 的 UIImageView 不适合约束

ios - 在 PromiseKit 6 中返回 void

swift - Xcode 7.3 更新错误 : "Use of unresolved identifier WLHttpMethodGet"

ios - 未使用 Storyboard 调用 UITextField 的委托(delegate)