我们如何在swift编程语言中定义以下内容:
换句话说,这些客观c术语中的每一个都是迅速等同的.此外,还想知道是否存在非结构c类型(如结构和枚举)的特定用例.提前致谢.
我们在XCode 6中引入了这个新的宏:NS_DESIGNATED_INITIALIZER
我在网上搜索,但无法找到任何关于如何使用它的好文档.
从语法上讲,我们可以使用它:
- (instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER;
Run Code Online (Sandbox Code Playgroud)
但是使用这个宏标记初始化程序有什么可能的优点,以及使用它时我们应该注意什么?
我主要对这个宏的用例感兴趣.任何链接/文档将不胜感激.
有人可以详细说明为什么nonnull在iOS 9中引入?
例如,该NSArray方法+ (instancetype)array;现在+ (instancetype nonnull)array;
请参阅:https: //developer.apple.com/library/prerelease/ios/releasenotes/General/iOS90APIDiffs/frameworks/Foundation.html
这是一个客观的c级功能,这将如何影响现有的应用程序?
假设我有如下现有代码:
enum SomeEnumCases {
case existing
case alreadyExisting
}
func doSomething(withEnums enumCase: SomeEnumCases) {
switch enumCase {
case .existing:
print("This case was already existing")
case .alreadyExisting:
print("This case was already existing too...")
}
}
Run Code Online (Sandbox Code Playgroud)
现在,如果要为枚举添加新的大小写,则上面的函数将显示一个编译错误,表明切换大小写必须是详尽无遗的,并且我将被迫处理新的丢失大小写。我会在switch语句中添加第三种情况,或添加默认语句。
现在,为了处理这种无法预料的枚举案例,我想@unknown default在上面的现有函数中添加一个案例。唯一的问题是,现在这将给我警告Default will never be executed。
所以问题是,我如何将来验证我的枚举,以便可以:
也就是说,以下代码不应发出警告:
enum SomeEnumCases {
case existing
case alreadyExisting
}
func doSomething(withEnums enumCase: SomeEnumCases) {
switch enumCase {
case .existing:
print("This case was already existing")
case .alreadyExisting:
print("This case was already existing …Run Code Online (Sandbox Code Playgroud) MemoryLayout 如何计算结构体的大小?
我读了这篇文章,我似乎理解得很好,直到我陷入了以下问题:
struct CertifiedPuppy1 {
let age: Int
let isTrained: Bool
let isCertified: Bool
}
MemoryLayout<CertifiedPuppy1>.size // 10
MemoryLayout<CertifiedPuppy1>.stride // 16
MemoryLayout<CertifiedPuppy1>.alignment // 8
struct CertifiedPuppy2 {
let isTrained: Bool
let age: Int
let isCertified: Bool
}
MemoryLayout<CertifiedPuppy2>.size // 17
MemoryLayout<CertifiedPuppy2>.stride // 24
MemoryLayout<CertifiedPuppy2>.alignment // 8
struct CertifiedPuppy3 {
let isTrained: Bool
let isCertified: Bool
let age: Int
}
MemoryLayout<CertifiedPuppy3>.size // 16 <--why not 10, like for CertifiedPuppy1 ??--
MemoryLayout<CertifiedPuppy3>.stride // 16
MemoryLayout<CertifiedPuppy3>.alignment // 8
Run Code Online (Sandbox Code Playgroud)
问题是,为什么CertifiedPuppy3 …
我有这样的JSON响应:
我目前将可解码结构设计如下:
struct PortfolioResponseModel: Decodable {
var dataset: Dataset
struct Dataset: Decodable {
var data: Array<PortfolioData> //I cannot use [Any] here...
struct PortfolioData: Decodable {
//how to extract this data ?
}
}
}
Run Code Online (Sandbox Code Playgroud)
问题是,如何提取数组中的数据,该数组的值可以为Double或String。
这是在操场上进行这项工作的示例字符串:
let myJSONArray =
"""
{
"dataset": {
"data": [
[
"2018-01-19",
181.29
],
[
"2018-01-18",
179.8
],
[
"2018-01-17",
177.6
],
[
"2018-01-16",
178.39
]
]
}
}
"""
Run Code Online (Sandbox Code Playgroud)
提取数据:
do {
let details2: PortfolioResponseModel = try JSONDecoder().decode(PortfolioResponseModel.self, from: myJSONArray.data(using: .utf8)!)
//print(details2)
//print(details2.dataset.data[0]) //somehow …Run Code Online (Sandbox Code Playgroud) 在玩结构时,我发现了以下内容:
struct SomeStruct {
private(set) var uncount: Int
subscript(i: Int) -> Int {
uncount = i // <--'self' is immutable-----
return 3
}
}
let someStructInstance = SomeStruct(uncount: 3)
someStructInstance[345]
Run Code Online (Sandbox Code Playgroud)
上面的代码没有编译,因为'self是不可变的',你不能在下标中添加mutating关键字.
但是,以下工作完美:
struct SomeStruct {
private(set) var uncount: Int
subscript(i: Int) -> Int {
get {
return 3
}
set {
uncount = i //<--works well now---
}
}
}
let someStructInstance = SomeStruct(uncount: 3)
someStructInstance[345]
Run Code Online (Sandbox Code Playgroud)
问题:当下标函数都改变了struct属性时,为什么一个工作,而另一个工作?