小编Log*_*gan的帖子

在Swift中打开Switch外部的Enum元组

因此,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)

为什么?

我没有充分的理由,我只是在试验这门语言.

swift

12
推荐指数
2
解决办法
3503
查看次数

在heroku上安装uuid-dev

  • uuid-dev默认不可用
  • sudo apt-get安装不起作用

如何将uuid-dev安装到heroku上的适当位置,最好使用buildpacks.

ubuntu uuid heroku shared-libraries

11
推荐指数
1
解决办法
434
查看次数

Vapor Web Framework:错误:Swift不支持SDK'MacOSX10.11.sdk'

当尝试使用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'

swift swift-package-manager vapor

10
推荐指数
1
解决办法
2950
查看次数

为什么我需要在Struct-Swift中明确声明一个可选值为nil

以下是文档的引用:

如果您的自定义类型具有逻辑上允许具有"无值"的存储属性 - 可能因为在初始化期间无法设置其值,或者因为在稍后的某个时间点允许它具有"无值" - 请使用可选类型.可选类型的属性将自动初始化,值为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.有没有理由我必须在结构上明确声明它?

为什么?

没有什么好理由,就像很多人一样,我只是在试验.

swift

9
推荐指数
1
解决办法
9279
查看次数

当多次执行相同的块时,块中的weakSelf和strongSelf会发生什么?

前言

根据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)

objective-c objective-c-blocks

7
推荐指数
1
解决办法
1386
查看次数

在Swift中的条件语句中为可选的新变量赋值的原因

我正在浏览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 …

swift

7
推荐指数
1
解决办法
3904
查看次数

将自定义结构中的值设置为Objective-C中的属性

我有一个带有标题的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)

objective-c

6
推荐指数
1
解决办法
2311
查看次数

是否有可能在Objective-C Generics - Xcode 7+中内省数组的类型

我使用它来获取属性名称的类:

- (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)

generics introspection objective-c objective-c-runtime ios

6
推荐指数
1
解决办法
397
查看次数

为什么将未命名的函数作为变换传递给数组会在最远的抽象中在操场中向迭代计数添加一个

我正在根据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次迭代?

swift

5
推荐指数
1
解决办法
313
查看次数

将可选绑定桥接到非可选子级 (SwiftUI)

我有一个可能存在的父状态:

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)

swift swiftui combine

5
推荐指数
1
解决办法
4888
查看次数