- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
在 Swift 类中,我们可以使用 类函数
来创建预设实例。就像下面的日历示例:
let calender = NSCalendar.currentCalendar()
这将具有与此类似的模式:
class SomeClass {
var attribute : String
init(value:String) {
attribute = value
}
class func testClass() -> SomeClass {
return SomeClass(value: "test")
}
}
let test = SomeClass.testClass()
但是结构中显然没有类函数。 Xcode 建议改用 static
。这非常接近单例模式。
struct SomeStruct {
var attribute : String
init(value:String) {
attribute = value
}
static var testStruct = SomeStruct(value: "test")
}
单例模式
class Singleton {
static let shared = Singleton()
private init() {
}
}
因此,这是一种使用预设值初始化结构的好方法,因为结构是值类型。如果不行,正确的做法是什么?
最佳答案
结构类型的 class func
等价于 static func
:
static func testStruct() -> SomeStruct {
return SomeStruct(value: "foo")
}
和静态属性(“单例模式”)的工作方式相同同时具有类和结构类型:
static let singleStruct = SomeStruct(value: "foo")
testStruct()
在每次调用时创建一个值,而 singleStruct
创建值一次(在第一次调用时)。
在大多数情况下,这没有什么区别,因为结构是值类型。如果创建值(value)是“昂贵的”。另外,正如@Lance 在评论中注意到的那样,Apple 经常使用此模式,例如 CGRect.zero
。
但是,如果结构具有以下属性,则情况会有所不同是引用类型(或指向非托管内存的指针)。这是一个例子:
class MyClass {
var attribute : String
init(value : String) {
attribute = value
}
}
struct SomeStruct {
var ptr : MyClass
init(value : String) {
ptr = MyClass(value: value)
}
static func testStruct() -> SomeStruct {
return SomeStruct(value: "foo")
}
static let singleStruct = SomeStruct(value: "foo")
}
使用静态函数:
let test1 = SomeStruct.testStruct()
print(test1.ptr.attribute) // foo
let test2 = SomeStruct.testStruct()
test2.ptr.attribute = "bar"
print(test1.ptr.attribute) // foo
这里 test1
和 test2
是单独的值,我们得到了预期的输出。
使用静态属性:
let test1 = SomeStruct.singleStruct
print(test1.ptr.attribute) // foo
let test2 = SomeStruct.singleStruct
test2.ptr.attribute = "bar"
print(test1.ptr.attribute) // bar <--- What?
这里,test1
和 test2
被设置为从返回的相同值静态属性。更改 test2.ptr
不会改变 test2
,导致 test1.ptr.attribute
参见 Friday Q&A 2015-04-17: Let's Build Swift.Array有关如何解决此问题的有趣文章。
顺便说一句,static
也可以与类类型一起使用,这里是 static
是 class final
的快捷方式:一个不能被覆盖的类型方法在一个子类中。由于它使结构类型没有继承感觉结构类型的类型方法被写成static
。
关于swift - 创建预设结构的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33637891/
我想我读过一些可以在 cocoa 应用程序中包含 NSUserDefaults 文件的地方。我似乎无法找到如何做到这一点。 我知道我可以在第一次应用程序启动时创建,但我还不想这样做...... 最佳答
所以我有一个 HTML 表单,用户可以在其中通过选中三个预设答案之一或编写自己的自定义答案来回答单选题。 虽然这显然是一个多对多关系,但我仍然找不到合适的方法来设计数据库表以处理这两种类型(TEXT
这个问题在这里已经有了答案: Unexpected token '=' in React Component [duplicate] (2 个答案) 关闭 4 年前。 我在使用 Webpack 构建
我正在创建一个自定义相机 View ,并尝试查看是否有办法为输入和输出设置不同的 session 预设。我希望能够向用户展示高分辨率,但以低分辨率捕获 var captureSession: AVCa
我当前的设置如下(基于 Brad Larson 的 ColorTrackingCamera 项目): 我正在使用设置为 AVCaptureSessionPreset640x480 的 AVCaptur
我正在开发一个 React-Native 应用程序,它是使用 Expo 安装的,使用以下代码创建 .babelrc 配置: { "presets": ["babel-preset-expo"]
在一个工作 Jest + puppeteer 操作项目中, 为了使用 jest-circus retry feature,我要去 jest-circus . 正如所记录的,我安装了 jest-circ
这个问题已经有答案了: How to use arrow functions (public class fields) as class methods? (4 个回答) 已关闭 4 年前。 当我尝
我正在使用实现 Browserify-Rails 的 Rails 4.0 项目实现Babelify . 在我的本地和远程 Beta 服务器上,一切似乎都很顺利。但是当我部署到生产环境时,某些文件将被跳
我正在向 dat.gui 界面动态添加控件,但“保存设置”功能无法识别它们。 var mygui = new dat.GUI(); mygui.remember(mygui); // standard
我想创建一个录制方形视频的自定义相机。然而,所有的捕获 session 预设都不是方形格式 例如: 1920x1080 1280x720 640x480 无论如何我可以创建一个自定义预设。我仍然想要高
function floatTo16BitPCM(output, offset, input){ for (var i = 0; i < input.length; i++, offset+=2)
我正在阅读有关使用 systemd 预设的 Fedora 打包指南,但遗漏了一个关键点: 宏 %systemd_post 运行 systemctl preset 意味着有关是否启用或禁用该服务的信息必
错误描述:当为 javascript 代码的简单单元测试运行 jest 时,出现错误测试套件无法运行未知选项:.preset 以下是重现错误的文件: { "name": "Relocati
我正在尝试使用 ffmpeg 和 x264 对视频进行编码。我知道 ffmpeg 从命令行使用程序 ffmpeg 时可以使用 x264 预设。但是在代码中使用 ffmpeg 编码时是否可以轻松使用
我的 npm 包构建使用 babel 运行,我在我的 package.json 中配置了一个 babel 预设 "babel": { "presets": ["es2015"] } 我还配置了一个 m
我们正在尝试使用 javacpp 重新编译 ffmpeg 项目,并启用 --enable-libfdk-aac ,构建可以正常工作,但我们无法使用 libfdk_aac 来解码 audio_strea
美好的一天: 我刚刚通过 NPM 安装了 Babel Preset-ENV 并遇到了这个问题: [nodemon] starting `babel-node server.js server.js`
我正在通过 ffmpeg(在 C++ 程序中)使用 libx264,我需要知道如何激活“非常快”预设。 x264 源代码树中的 grep 生成: include/x264.h:static const
我正在处理的一个项目已经配置了 Jest,并且测试工作正常。这就是当前 jest.config.js 文件的样子; const ignores = [...]; const coverageIgnor
我是一名优秀的程序员,十分优秀!