我将我的项目从Swift 2.2升级到2.3(Xcode 7到8),并在一台Mac上提交了所有内容.当我从其他Mac上的git中取出并构建时,我得到:
Warning: target specifies SWIFT_VERSION = '2.3', but it is overridden by TOOLCHAINS = 'com.apple.dt.toolchain.XcodeDefault'
Run Code Online (Sandbox Code Playgroud)
我在任何文件中都找不到任何名为"TOOLCHAINS"的东西.这个警告意味着什么?
我正在尝试编写一个扩展方法[String].
看起来你不能[String]直接扩展("Type'Element'约束到非协议类型'String'"),虽然我遇到了这个伎俩:
protocol StringType { }
extension String: StringType { }
Run Code Online (Sandbox Code Playgroud)
但我还是不能让Swift类型的系统满意:
extension Array where Element: StringType {
// ["a","b","c","d","e"] -> "a, b, c, d, or e".
func joinWithCommas() -> String {
switch count {
case 0, 1, 2:
return joinWithSeparator(" or ")
default:
return dropLast(1).joinWithSeparator(", ") + ", or " + last!
}
}
}
Run Code Online (Sandbox Code Playgroud)
该joinWithSeparator电话是"暧昧".我已经尝试了我能想到的一切,比如使用(self as! [String])(以及一些类似的变体),但似乎没有任何效果.
如何让Swift编译器满意呢?
首先,我尝试映射a [String?],得到一个[String]:
$ xcrun swift
Welcome to Apple Swift version 2.2 (swiftlang-703.0.18.8 clang-703.0.30). Type :help for assistance.
1> import Foundation
2> let j: [String?] = ["a", nil]
j: [String?] = 2 values {
[0] = "a"
[1] = nil
}
3> j.map {$0 ?? ""}
$R0: [String] = 2 values {
[0] = "a"
[1] = ""
}
Run Code Online (Sandbox Code Playgroud)
这对我来说非常有意义.我没有合并String?,我得到了一个String.但是[AnyObject?],有一些奇怪的事情发生:
4> let k: [AnyObject?] = ["a", nil]
k: [AnyObject?] = 2 values …Run Code Online (Sandbox Code Playgroud) 我对Swift中的动态类型检查感到困惑.
具体来说,我有一个怪异的情况,我想在本质上写一个(或找到)一个函数:
func isInstanceOf(obj: Any, type: Any.Type) -> Bool
Run Code Online (Sandbox Code Playgroud)
在Objective-C中,这是isKindOfClass,但这不起作用,因为Any.Type包括Swift结构,它不是类(更少的NSObject子类).
我不能is在这里使用Swift ,因为这需要硬编码类型.
我无法使用,obj.dynamicType == type因为这会忽略子类.
在斯威夫特书似乎表明,该信息将丢失,且没有可用的结构在所有:
类具有结构不具备的附加功能:
...
- 类型转换使您可以在运行时检查和解释类实例的类型.
(在Type Casting一章中,它说"Swift中的类型转换是用is和as运算符实现的",所以它似乎是一个比其他语言更广泛的"类型转换"定义.)
但是,不能使用is/ as不能使用结构,因为你可以将字符串和Ints放入一个[Any],然后将它们拉出来,并使用is String或is Int弄清楚它们是什么.Swift Book的Type Casting章节正是这样做的!
有什么东西isKindOfClass和任何Swift实例一样强大吗?这些信息仍然必须在运行时存在,对吧?
(我发现了几个类似的问题,但没有完全相同.有些问题比有问题的操作系统要老.有些人做了疯狂的事情,比如完全自定义的窗口.我找不到有关如何使普通窗口正常工作的说明.)
从OS X Lion开始,标准窗口有圆角.不幸的是,我无法在我的应用程序中复制它.当NSView被推到NSWindow的角落时,有时它会被限制在圆形NSWindow上,有时它会逃脱并形成一个方角.
我还没能弄清楚一个模式.
例如,创建一个新的Cocoa项目,在主NSWindow中放置(滚动)NSTableView或NSTextView,并添加布局约束,使其跟随窗口的边缘.底角是方形的!相比之下,Finder有一个(看起来像)NSTableView,就在窗户的底角,它是圆形的.
如何制作一个普通的NSWindow,底部有适当的圆角?
我在一个窗口中有一个MKMapView,并且pitchEnabled是真的(我已经在调试器中证实了这一点).指南针中间的"3D"东西是灰色的,点击或拖动它什么都不做.选项 - 拖动地图(就像我在Maps.app中所做的那样)也没有做任何事情.
根据我对文档的解释,设置pitchEnabled应该让我使用3D视图,就像Maps.app那样.我错了吗?我还需要做些什么来让我的用户获得3D地图视图吗?
我似乎无法在 StackOverflow 或网络上的其他地方找到有关此标志的任何信息。苹果自己的文档只说:
如果格式化程序设置为宽松,则在解析字符串时,它会使用启发式方法来猜测预期的日期。与任何猜测一样,它可能会得到错误的结果日期(即,不是预期的日期)。
也许我误解了它应该如何工作,但我根本无法让它工作。我的猜测是这样的(解析日期相对容易):
> import Foundation
> let df = DateFormatter()
> df.isLenient = true
> df.date(from: "12:00 1/1/2001")
$R0: Date? = nil
Run Code Online (Sandbox Code Playgroud)
无论我尝试什么,我都没有。
我还看到有一个doesRelativeDateFormatting标志,声称支持诸如“今天”和“明天”之类的短语,但这似乎也没有任何作用:
> df.doesRelativeDateFormatting = true
> df.date(from: "today")
$R1: Date? = nil
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
这个答案说要使用过去运行良好的LSCopyKindStringForURL(),但它在OS X v10.11中被标记为"已弃用".
API文档中没有提到它被弃用的原因.我根本没有在OS X 10.11发行说明中看到任何启动服务API更改.
你现在应该如何获得Finder种类的文件?