我知道Swift相对较新,但我想知道是否有办法确定设备类型?
(就像以前一样可以使用#define
)?
主要是我想知道如何区分OS X或iOS。我在这个问题上一无所获。
答案 0 :(得分:64)
如果您正在构建iOS和OS X(现在也可能是watchOS和tvOS),那么您至少要构建两次代码:每个平台一次。如果要在每个平台上执行不同的代码,则需要构建时条件,而不是运行时检查。
Swift没有预处理器,但它确实有条件构建指令 - 并且在大多数情况下,它们看起来像C等价物。
#if os(iOS) || os(watchOS) || os(tvOS)
let color = UIColor.redColor()
#elseif os(OSX)
let color = NSColor.redColor()
#else
println("OMG, it's that mythical new Apple product!!!")
#endif
您还可以使用构建配置来测试体系结构(x86_64
,arm
,arm64
,i386
)或-D
编译器标志(包括{ {1}}标志由标准Xcode模板定义。)
请参阅使用Swift与Cocoa和Objective-C 中的Preprocessor Directives。
(如果你想区分你在运行时使用哪种类型的iOS设备,请像使用ObjC一样使用DEBUG
类。它通常更有用,更安全。在您重要的设备属性而不是设备名称或习惯用法 - 例如,使用特征和大小类来布置您的UI,查询OpenGL以获得所需的GPU功能等。)
答案 1 :(得分:3)
自Swift 4.2起,您可以替换
#if os(iOS) || os(watchOS) || os(tvOS)
let color = UIColor.redColor()
#elseif os(OSX)
let color = NSColor.redColor()
#else
println("OMG, it's that mythical new Apple product!!!")
#endif
按
#if canImport(UIKit)
let color = UIColor.redColor()
#elseif os(OSX)
let color = NSColor.redColor()
#else
#error("OMG, it's that mythical new Apple product!!!")
#endif
答案 2 :(得分:2)
这应该为您提供所有用例:
#if os(OSX)
print("macOS")
#elseif os(watchOS)
print("watchOS")
#elseif os(tvOS)
print("tvOS")
#elseif os(iOS)
#if targetEnvironment(macCatalyst)
print("macOS - Catalyst")
#else
print("iOS")
#endif
#endif
答案 3 :(得分:0)
为Mac Catalyst更新。现在,您还可以使用以下命令确定是iOS还是Mac Catalyst:
let color: UIColor
#if targetEnvironment(macCatalyst)
color = .systemRed
#else
color = .systemBlue
#endif
例如。
答案 4 :(得分:0)
enum TargetDevice {
case nativeMac
case iPad
case iPhone
case iWatch
public static var currentDevice: Self {
var currentDeviceModel = UIDevice.current.model
#if targetEnvironment(macCatalyst)
currentDeviceModel = "nativeMac"
#elseif os(watchOS)
currentDeviceModel = "watchOS"
#endif
if currentDeviceModel.starts(with: "iPhone") {
return .iPhone
}
if currentDeviceModel.starts(with: "iPad") {
return .iPad
}
if currentDeviceModel.starts(with: "watchOS") {
return .iWatch
}
return .nativeMac
}
}
用法:
print(AppUtilities.TargetDevice.currentDevice)
答案 5 :(得分:-2)
我已实施超轻量级库来检测已使用的设备:https://github.com/schickling/Device.swift
可以通过Carthage进行安装,并按照以下方式使用:
call'
from /home/ruby/.rbenv/versions/2.2.2/lib/ruby/2.2.0/tsort.rb:345:in
答案 6 :(得分:-2)
var device = UIDevice.currentDevice().model
这段代码对我有用。我已经在textfield和keyboard上解决了部分问题。见下文。
func textFieldShouldBeginEditing(textField: UITextField) -> Bool
{
print(device)
if (textField.tag == 1 && (device == "iPhone" || device == "iPhone Simulator" ))
{
var scrollPoint:CGPoint = CGPointMake(0,passwordTF.frame.origin.y/2);
LoginScroll!.setContentOffset(scrollPoint, animated: true);
}
else if (textField.tag == 2 && (device == "iPhone" || device == "iPhone Simulator"))
{
var scrollPoint:CGPoint = CGPointMake(0,passwordTF.frame.origin.y/1.3);
LoginScroll!.setContentOffset(scrollPoint, animated: true);
}
return true
}