因此,Swift中一个很酷的新功能是更先进enum的,并且可以关联更复杂的数据.例如,我可以这样做:
enum Location {
case GeoPoint(latitude: Double, longitude: Double)
case Address(address: String)
}
var address = Location.Address(address: "1234 Fake St, Fakesville TN, 41525")
var geoPoint = Location.GeoPoint(latitude: 42.342, longitude: -32.998)
// address or geoPoint
switch address {
case .Address(let addressStr):
// Unwrapped value as 'addressStr'
println("Address: \(addressStr)")
case .GeoPoint(let latitude, let longitude):
// Unwrapped values as 'latitude' and 'longitude'
println("lat: \(latitude) long: \(longitude)")
}
Run Code Online (Sandbox Code Playgroud)
是否有可能在switch声明之外解开这些内在价值?就像是:
var addressStr = address.0
Run Code Online (Sandbox Code Playgroud)
为什么?
我没有充分的理由,我只是在试验这门语言.
如何将uuid-dev安装到heroku上的适当位置,最好使用buildpacks.
当尝试使用Swift 3和Xcode构建Vapor 0.13(以及可能的其他版本)时
环境
Vapor: 0.13
Swift: 3
Snapshot: DEVELOPMENT-SNAPSHOT-06-20-A
Xcode: 8
Run Code Online (Sandbox Code Playgroud)
以下错误通常是第一个结果:
错误:Swift不支持SDK'MacOSX10.11.sdk'
以下是文档的引用:
如果您的自定义类型具有逻辑上允许具有"无值"的存储属性 - 可能因为在初始化期间无法设置其值,或者因为在稍后的某个时间点允许它具有"无值" - 请使用可选类型.可选类型的属性将自动初始化,值为nil,表示该属性在初始化期间故意具有"无值".
如果我用一个类来做这件事就可以了:
class MyClass {
var someProperty: String?
}
var myClass = MyClass()
myClass.someProperty // Shows nil
Run Code Online (Sandbox Code Playgroud)
但是,如果我使用结构类型执行此操作,则会在初始化时出错:
struct MyStruct {
var someProperty: String?
}
// ERROR
var myStruct = MyStruct()
Run Code Online (Sandbox Code Playgroud)
错误:
缺少参数'someProperty'的参数
我可以通过明确地声明它来解决这个问题:
struct MyStruct {
var someProperty: String? = nil
}
// Valid
var myStruct = MyStruct()
Run Code Online (Sandbox Code Playgroud)
鉴于文档,我希望任何类型的属性作为选项被默认为nil.有没有理由我必须在结构上明确声明它?
为什么?
没有什么好理由,就像很多人一样,我只是在试验.
根据Clang文档,"对于__weak对象,当前的指针被保留,然后在当前的完整表达式结束时释放." 对我来说,如果我这样做:
__weak typeof(self) weakSelf = self;
[self doSomethingInBackgroundWithBlock:^{
if (weakSelf) {
[weakSelf doSomethingInBlock];
}
}];
Run Code Online (Sandbox Code Playgroud)
注意
如果您在下面引用@dasblinkenlight的答案,您会注意到有可能weakSelf成为nil之前doSomethingBlock.
假设doSomethingInBlock,从weakSelf现有开始,其余部分应该没有问题,并且在完成执行之前没有weakSelf成为风险nil.但是,如果我要运行这个:
__weak typeof(self) weakSelf = self;
[self doSomethingInBackgroundWithBlock:^{
if (weakSelf) {
// Guaranteed to be retained for scope of expression
[weakSelf doSomethingInBlock];
// weakSelf could possibly be nil before reaching this point
[weakSelf doSomethingElseInBlock];
}
}];
Run Code Online (Sandbox Code Playgroud)
建议的解决方法是weakSelf将其转换为块内的强变量,如下所示:
__weak typeof(self) weakSelf = self;
[self …Run Code Online (Sandbox Code Playgroud) 我正在浏览swift文档,在可选段中,它讨论了使用问号 - ?表示可能为零的变量.这可以在if语句中用于检查nil,但在文档中,它们将可选项分配给条件中的新变量.是否有一个原因?
例如,它在类似于此的文档中呈现:
// Declare an optional string (might be nil)
var optionalString: String? = "Hello"
// Assigns optionalString to new variable before checking if nil
if let string = optionalString {
println("\(optionalString) is not nil!")
}
else {
println("\(optionalString) is nil")
}
Run Code Online (Sandbox Code Playgroud)
但是,在测试中这对我来说运行得很好:
var optionalString: String? = "Hello"
// Assigns optionalString to new variable before checking if nil
if optionalString {
println("\(optionalString) is not nil!")
}
else {
println("\(optionalString) is nil")
}
Run Code Online (Sandbox Code Playgroud)
是否有理由在条件语句中分配optionalString …
我有一个带有标题的A类看起来像这样:
typedef struct {
int x;
int y;
} Position;
@interface ClassA : NSObject
@property Position currentPosition;
@end
Run Code Online (Sandbox Code Playgroud)
我尝试在另一个类中为属性分配位置结构的各个值,如下所示:
ClassA * classA = [ClassA new];
classA.currentPosition.x = 10;
Run Code Online (Sandbox Code Playgroud)
这给出了错误"表达式不可分配"并且不会编译.
我可以像这样设置:
ClassA * classA = [ClassA new];
Position position = {
.x = 1,
.y = 2
};
classA.currentPosition = position;
Run Code Online (Sandbox Code Playgroud)
我甚至可以改变position变量的各个"属性",如下所示:
ClassA * classA = [ClassA new];
Position position = {
.x = 1,
.y = 2
};
// WORKS
position.x = 4;
// DOESN'T WORK
// classA.currentPosition.x …Run Code Online (Sandbox Code Playgroud) 我使用它来获取属性名称的类:
- (Class)gm_classForPropertyName:(NSString *)propertyName {
objc_property_t prop = class_getProperty([self class], propertyName.UTF8String);
const char * attr = property_getAttributes(prop);
NSString *attributes = [NSString stringWithUTF8String:attr];
NSArray *components = [attributes componentsSeparatedByString:@"\""];
Class propertyClass;
for (NSString *component in components) {
Class class = NSClassFromString(component);
if (class) {
propertyClass = class;
break;
} else {
class = swiftClassMapping[component];
if (class) {
propertyClass = class;
break;
}
}
}
return propertyClass;
}
Run Code Online (Sandbox Code Playgroud)
但这是重要的部分:
objc_property_t prop = class_getProperty([self class], propertyName.UTF8String);
const char * attr = property_getAttributes(prop);
NSString *attributes …Run Code Online (Sandbox Code Playgroud) 我正在根据Swift编程指南中的示例,将未命名的函数作为参数传递,并且我正在使用它来练习.
所以我们有一个Ints 数组:
var numbers: Int[] = [1, 2, 3, 4, 5, 6, 7]
Run Code Online (Sandbox Code Playgroud)
我应用这样的变换:(7)
func transformNumber(number: Int) -> Int {
let result = number * 3
return result
}
numbers = numbers.map(transformNumber)
Run Code Online (Sandbox Code Playgroud)
等于:(7)
numbers = numbers.map({(number: Int) -> Int in
let result = number * 3
return result;
})
Run Code Online (Sandbox Code Playgroud)
等于:(8)
numbers = numbers.map({number in number * 3})
Run Code Online (Sandbox Code Playgroud)
等于:(8)
numbers = numbers.map({$0 * 3})
Run Code Online (Sandbox Code Playgroud)
等于:(8)
numbers = numbers.map() {$0 * 3}
Run Code Online (Sandbox Code Playgroud)
正如您在下图中所看到的,操场侧栏中的迭代计数显示,在函数声明的最远抽象中,它具有8个计数.

为什么它显示为最后两个示例的8次迭代?
我有一个可能存在的父状态:
class Model: ObservableObject {
@Published var name: String? = nil
}
Run Code Online (Sandbox Code Playgroud)
如果该状态存在,我想显示一个子视图。在此示例中,显示name.
如果name可见,我希望它能够显示和编辑。我希望它是双向可编辑的,这意味着如果Model.name发生更改,我希望它推送到 ChildUI,如果 ChildUI 编辑它,我希望它反映回Model.name.
但是,如果Model.name变成了nil,我想ChildUI隐藏。
当我这样做时,通过展开,那么现在控制该状态的人Model.name只会捕获第一个值。Child后续更改不会推送到上游,因为它不是Binding.
问题
当可选存在时,我可以将非可选上游绑定到可选吗?(这些词合适吗?)
完整示例
import SwiftUI
struct Child: View {
// within Child, I'd like the value to be NonOptional
@State var text: String
var body: some View {
TextField("OK: ", text: $text).multilineTextAlignment(.center)
}
}
class Model: ObservableObject {
// …Run Code Online (Sandbox Code Playgroud)