我有一个 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()
这里 locationParser
和 locationTracker
没有理由相互引用或 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 是 Apple 的方式,但您可以从其他方法的知识中获益。另请注意,依赖项注入(inject)文章提供了 Objective-C
代码示例。我知道您正在学习 Swift,但如果可以的话,最好了解 Objective-C
的应用知识。 Apple 的框架仍然全部用 Objective-C
编写。
关于swift - 从一个类调用另一个类的函数,Xcode 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36680357/