在Swift和Java Kotlin中声明自定义类型



我是编程初学者。我正在学习Swift和Java Kotlin来开发应用程序。我还是IT工程专业的学生。

我在C语言模块化中学到了,这意味着有一个库,在其中声明类型、操作和函数,我在主文件中调用这些操作、函数和类型,在头中声明文件。

我试图在Swift和Kotlin中做一些类似的事情,创建一个文件,在其中声明我的自定义类型,并在不同的视图类中调用它们。

在Swift中,我知道没有必要导入类型所在的文件。

例如,我在Swift 中声明了以下类型

struct tUser {
var userId: Int
var name: String
var birthday: tDate
var location: String
var province: String
var email: String
var userPassword: String
var picture: Image
var favorites: tFavorite
}
struct tDate {
var day: Int
var month: Int
var year: Int
}
struct tFavorite {
var identifyer: Int
}
If I would initialize the types in C I would do
tUser newUser;
newUser.userId = 001;
newUser.name = "John"

我试图在Swift和Kotlin中做同样的事情,但在Swift中我得到了错误"顶级不允许表达式",在Kotlin我也有错误。

也许答案是,在面向对象语言中这样做是没有意义的

有人能在这件事上帮我吗?

谢谢,

很高兴看到有新人加入Swift,欢迎!

你可以在Swift中做你想做的事情,但你必须在允许的范围内(例如一个类或结构)。

如果您创建了一个新的Playground而不是XCode项目,那么您应该能够像在C.中那样进行

如果您想使用项目,XCode中的"新项目">模板应该为您提供一个可以处理的<ViewController.swift">文件。

首先,在项目中创建一个新的"Example.swift">文件,并将结构定义粘贴到那里。之后,返回ViewController.swift文件并查看函数viewDidLoad。在里面,试着像你那样初始化你的对象。

这将解决范围问题。至于初始化问题,如果不为属性提供默认值,就无法准确地创建像C这样的对象:

struct tUser {
var userId: Int = 0
var name: String = ""
var birthday: tDate
var location: String = ""
var province: String = ""
var email: String = ""
var userPassword: String = ""
var picture: Image
var favorites: tFavorite
}

我将让您了解如何对自定义tDatetFavorite结构执行同样的操作。在你提供它们之后,你应该能够初始化一个对象:

var user = tUser()

另一个选项是将属性定义为Optional,如:var name: String?Optional是一个单独的讨论主题。

我建议阅读Swift的官方电子书,以便在开始时对初始化和整体语言有一个基本的了解。在我看来,它被记录得很好。

希望它能帮助你,祝你好运!

可以在Kotlin中做您想要的事情(我不知道Swift),将每种类型放入一个类中,并将代码放入顶级函数中。但这并没有利用物体的好处。

一般来说,在面向对象的语言中,您将数据(状态)捆绑在一起,即您可以对该数据(行为)执行的操作;共同构成一个阶级。

您在这里没有显示任何操作,但我相信您知道您计划如何处理"用户"、"日期"one_answers"收藏夹"类型。例如,假设您想对Date做的一件事是查看今天是否是周年纪念日:您有一个方法(类函数)。也许是这样的:

class Date(val day: Int, val month: Int, val year: Int) {
fun isAnniversaryToday(): Boolean {
// TODO Code here
}
}

然后你可以用val myDate = Date(2, 6, 2000)创建你的Date,并用myDate.isAnniversaryToday()检查它是否是生日。

不过,这是一个糟糕的例子,因为编写自己的日期类是一个非常糟糕的主意——它很容易出错,或者遇到时区、闰秒、夏令时间或日历差异的问题,而且大多数语言的标准库中都有很好的日期处理。因此,在Java和Kotlin/JVM的情况下,应该使用Java.time类。同样,对于图像、列表和许多其他类型也是如此。一般来说,任何不特定于你的应用程序的事情都可能以前做过,所以(除非你是为了练习而写的)你应该尽可能避免重新发明轮子!

因此,与你在C中学到的主要区别在于心态:在像C这样的过程语言中,程序是函数和数据结构的集合,而在OO语言中,一个程序是相互关联的类的集合,每个类都有一些数据和/或行为。每个方法都与它的类紧密相连,很容易在类的命名空间中找到,并且它可以对类的状态进行特权访问(您可以限制或隐藏它)。这可能需要一点时间来适应,但事实证明,这是一种非常强大的技术,可以安全地编写大型系统。

这些都不是特定语言特有的。正如我所说,我不了解Swift,但我希望其原理与Kotlin、C++或许多其他现代语言中的原理基本相同。因此,您可能想阅读一些OO设计以及任何语言教程。

(这个网站不是关于选择哪种技术的建议的地方,但我可以说我喜欢Kotlin:它比我尝试过的任何其他语言都更安全、更干净、更简洁、更具表达力,使用起来真的很愉快。现在它是安卓的官方语言,人们将其与之联系在一起,但它是一种非常好的通用语言——我们所有的后端开发都是用它来完成的,我用它编写了桌面应用程序。所有的文档都在网上,还有一些好书。)

是Kotlin特有的一点:如果您的结构真的只是一个数据持有者,并且没有任何行为,那么通常最好将其设置为data class,例如:

data class Date(var day: Int, var month: Int, var year: Int)

然后,编译器将为许多标准方法(equals()hashCode()toString()、复制构造函数和c)生成实现,这些方法将赋予它值语义:例如,具有相同状态的两个对象将被视为相等,这不是大多数类的默认值。

最新更新