小编Cra*_*tis的帖子

通过可选绑定在Swift中进行安全(边界检查)数组查找?

如果我在Swift中有一个数组,并尝试访问超出范围的索引,则会出现一个不足为奇的运行时错误:

var str = ["Apple", "Banana", "Coconut"]

str[0] // "Apple"
str[3] // EXC_BAD_INSTRUCTION
Run Code Online (Sandbox Code Playgroud)

但是,我会想到Swift带来的所有可选链接和安全性,这样做会很简单:

let theIndex = 3
if let nonexistent = str[theIndex] { // Bounds check + Lookup
    print(nonexistent)
    ...do other things with nonexistent...
}
Run Code Online (Sandbox Code Playgroud)

代替:

let theIndex = 3
if (theIndex < str.count) {         // Bounds check
    let nonexistent = str[theIndex] // Lookup
    print(nonexistent)   
    ...do other things with nonexistent... 
}
Run Code Online (Sandbox Code Playgroud)

但事实并非如此 - 我必须使用ol' if语句来检查并确保索引小于str.count.

我尝试添加自己的subscript()实现,但我不知道如何将调用传递给原始实现,或者不使用下标符号来访问项目(基于索引):

extension Array {
    subscript(var index: Int) …
Run Code Online (Sandbox Code Playgroud)

xcode swift

252
推荐指数
10
解决办法
7万
查看次数

在Swift中使用"未声明的类型",即使类型是内部的,也存在于同一模块中

我的模块中有一个类型:

import Cocoa

class ColoredDotView : NSView {
   ...
}
Run Code Online (Sandbox Code Playgroud)

它用于许多不同的类,没有问题:

class EditSubjectPopoverController : NSObject {

    @IBOutlet internal var subjectColorDotView : ColoredDotView!
    ...
}
Run Code Online (Sandbox Code Playgroud)

但由于某种原因,当我在一个特定的类中使用它时,我在类型上有编译错误:

class EditTaskPopoverController : NSObject {

    @IBOutlet internal var lowPriorityDotView : ColoredDotView! // Error here
    @IBOutlet internal var medPriorityDotView : ColoredDotView! // And here...
    @IBOutlet internal var highPriorityDotView : ColoredDotView! // And here...
    ...
}
Run Code Online (Sandbox Code Playgroud)

编译错误是:

EditTaskPopoverController.swift:15:49:使用未声明类型'ColoredDotView'

哪个我不明白.这是文件中的第一个编译错误,其余的错误都是第一个的症状.此外,没有其他文件存在编译错误.我不明白为什么类型是未声明的,因为该文件在同一模块中:

在此输入图像描述

我已经尝试清理项目,清理构建文件夹,然后重新启动Xcode,但无济于事.什么潜在的错误可能导致undeclared typeSwift中的编译器错误?

xcode swift

159
推荐指数
10
解决办法
19万
查看次数

Xcode 4.6.3中Dropbox API的协同设置失败:"代码对象根本没有签名"

我有一个OS X应用程序,它通过Mac App Store分发,最近更新到Xcode 4.6.3.

当我现在运行常规构建时,我会收到:

Command /usr/bin/codesign failed with exit code 1:

/Users/Craig/Library/Developer/Xcode/DerivedData/Mac-dxcgahgplwpbjedqnembegifbowj/Build/Products/Debug/MyApp.app: code object is not signed at all
In subcomponent: /Users/Craig/Library/Developer/Xcode/DerivedData/Mac-dxcgahgplwpbjedqnembegifbowj/Build/Products/Debug/MyApp.app/Contents/Frameworks/DropboxOSX.framework
Command /usr/bin/codesign failed with exit code 1
Run Code Online (Sandbox Code Playgroud)

我似乎无法辨别我的项目中的任何其他更改,因此我无法判断它是否与4.6.3更新或其他相关的问题.

我尝试重新启动Xcode,运行干净的构建,并清理构建文件夹.

macos xcode code-signing dropbox mac-app-store

75
推荐指数
3
解决办法
3万
查看次数

在NSDictionary中使用class作为键

我正在编写一个上下文"工厂",它将维护一个继承自某些Converter类的转换器/动作对象的字典.这个类有一个方法:

- (Class)classResponsibility
Run Code Online (Sandbox Code Playgroud)

或类似的东西,这样StringConverter类将实现该方法:

- (Class)classResponsibility {
    return [NSString class];
}
Run Code Online (Sandbox Code Playgroud)

然后将该转换器存储在字典中,我曾希望做类似的事情:

[converters setValue:stringConverter forKey:[stringConverter classResponsibility]];
Run Code Online (Sandbox Code Playgroud)

但是编译器抱怨类型"Class"是setValue:forKey:方法的参数2的无效参数类型.我本来想避免将密钥设置为类的名称("NSString"),但如果这是最好的解决方案而不是我会使用它.

dictionary objective-c

37
推荐指数
3
解决办法
3万
查看次数

冲突的git合并后清理?

.h正在处理的项目中的头文件中有一个小冲突.该项目在Git中进行跟踪.

幸运的是,冲突很容易解决.我用了

git mergetool

并选择了opendiff我的Mac上似乎是FileMerge 的默认值().我做了相应的更改,保存了文件,然后关闭了.

然后Git问我合并是否成功,我说是的:

Was the merge successful? [y/n] y

但现在,我有:

> git st
# On branch develop
# Changes to be committed:
#   modified:   MyHeader.h
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   MyHeader.h.BACKUP.52920.h
#   MyHeader.h.BASE.52920.h
#   MyHeader.h.LOCAL.52920.h
#   MyHeader.h.REMOTE.52920.h
#   MyHeader.h.orig
Run Code Online (Sandbox Code Playgroud)

哪些额外的垃圾冲突文件是由FileMerge创建的,哪些是由Git创建的?

更重要的是:我如何删除它们?

git version-control merge filemerge merge-conflict-resolution

27
推荐指数
2
解决办法
1万
查看次数

从Class <?获取枚举实例?扩展Enum>使用String值?

我发现很难将确切的问题写成文字,所以我只想举个例子.

我有两种Enum类型:

enum Shape {
    CAT, DOG;
}

enum Color {
    BLUE, RED;
}
Run Code Online (Sandbox Code Playgroud)

我有一个方法:

public Object getInstance(String value, Class<?> type);
Run Code Online (Sandbox Code Playgroud)

我想用这样的方法:

// someValue is probably "RED", and someEnumClass is probably Color.class
Color c = getInstance(someValue, someEnumClass);
Run Code Online (Sandbox Code Playgroud)

我一直无法确定如何实施getInstance().一旦知道了Enum要实例化的确切类,就很容易:

Color.valueOf("RED");
Run Code Online (Sandbox Code Playgroud)

但是如何通过一个未知的方式完成上述这一行Class呢?(但是,已知它someEnumClass是.的子类Enum.)

谢谢!

java reflection enums class instantiation

24
推荐指数
1
解决办法
3万
查看次数

在子类的子类中实现NSCopying

我有一个小类层次结构,我无法实现copyWithZone:.我已经阅读了NSCopying文档,但我找不到正确的答案.

选择两个类:ShapeSquare.Square定义为:

@interface Square : Shape
Run Code Online (Sandbox Code Playgroud)

这并不奇怪.每个类都有一个属性,Shape有一个"sides"int,而Square有一个"width"int.该copyWithZone:方法被认为如下:

形状

- (id)copyWithZone:(NSZone *)zone {
    Shape *s = [[Shape alloc] init];
    s.sides = self.sides;
    return s;
}
Run Code Online (Sandbox Code Playgroud)

广场

- (id)copyWithZone:(NSZone *)zone {
    Square *s = (Square *)[super copyWithZone:zone];
    s.width = self.width;
    return s;
}
Run Code Online (Sandbox Code Playgroud)

看一下文档,这似乎是做事的"正确"方式.

它不是.

如果您尝试设置/访问copyWithZone:方法返回的Square的width属性,它将失败,并出现类似于下面的错误:

2010-12-17 11:55:35.441 Hierarchy[22617:a0f] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Shape setWidth:]: unrecognized selector sent to instance 0x10010c970'
Run Code Online (Sandbox Code Playgroud)

调用[super …

xcode memory-management objective-c hierarchy nscopying

22
推荐指数
1
解决办法
6350
查看次数

Gitlab CI运行器无法公开嵌套Docker容器的端口

当使用GitLab CI以及它时gitlab-ci-multi-runner,我无法获得内部启动的Docker容器以将其端口暴露给"主机",这是运行构建的Docker映像.

我的.gitlab-ci.yml档案:

test:
  image: docker
  stage: test
  services:
    - docker:dind
  script:
    - APP_CONTAINER_ID=`docker run -d --privileged -p "9143:9143" appropriate/nc nc -l 9143`
    - netstat -a
    - docker exec $APP_CONTAINER_ID netstat -a
    - nc -v localhost 9143
Run Code Online (Sandbox Code Playgroud)

我的命令:

gitlab-ci-multi-runner exec docker --docker-privileged test
Run Code Online (Sandbox Code Playgroud)

输出:

$ netstat -a
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 runner--project-1-concurrent-0:54664 docker:2375             TIME_WAIT
tcp        0      0 runner--project-1-concurrent-0:54666 docker:2375             TIME_WAIT
Active UNIX domain …
Run Code Online (Sandbox Code Playgroud)

gitlab docker gitlab-ci docker-compose

22
推荐指数
2
解决办法
8004
查看次数

Git合并策略'他们'不解决修改/删除冲突

git merge使用以下选项执行a 时:

git merge -X theirs master

偶尔会有冲突的文件:

CONFLICT(修改/删除):在master中删除File_A.java并在HEAD中修改.File_A.java的版本HEAD留在树中.

但是,我希望-X theirs在这些情况下识别该选项,并使用theirs更改的版本,该版本用于删除该文件.

是否有原因导致此类冲突无法自动解决,特别是因为我提供了一个特定的合并策略,建议它应该删除该文件?

此外,如何(如果可能)我可以更新我的merge命令以使用theirs此类冲突的版本?

git

21
推荐指数
2
解决办法
3275
查看次数

如何使用Xcode / Instruments / Time Profiler来分析React Native源代码

我们正在使用React Native 0.59.10和React-Redux 5.0.7,并且遇到了CPU限制的性能问题,其中我们的Redux操作需要大约0.25秒才能完成。

我们已经使用Instruments中的“时间剖析器”配置进行了剖析,但是我们的JS代码都没有符号化。

在Chrome中进行远程调试似乎只是调试“远程检查器”页面,这完全无济于事。

有没有一种方法可以将源映射建立或附加到JS函数名称/调用,或用符号表示下面看到的内存地址?

仪器调用栈

javascript xcode instruments ios react-native

18
推荐指数
1
解决办法
333
查看次数